lsym_case_label.c revision 1.7
11.7Srillig/* $NetBSD: lsym_case_label.c,v 1.7 2023/06/04 12:46:57 rillig Exp $ */
21.1Srillig
31.1Srillig/*
41.7Srillig * Tests for the tokens lsym_case and lsym_default, which represent the
51.7Srillig * keywords 'case' and 'default', which are both used in 'switch' statements.
61.1Srillig *
71.1Srillig * Since C11, the keyword 'default' is used in _Generic selections as well.
81.1Srillig *
91.1Srillig * See also:
101.2Srillig *	opt_cli.c
111.1Srillig *	psym_switch_expr.c
121.1Srillig *	C11 6.5.1.1		"Generic selection"
131.1Srillig */
141.1Srillig
151.4Srillig/*
161.4Srillig * A case label can be used in a 'switch' statement.
171.4Srillig */
181.6Srillig//indent input
191.4Srilligvoid function(void){switch(expr){case 1:;case 2:break;default:switch(inner){case 4:break;}}}
201.6Srillig//indent end
211.1Srillig
221.6Srillig//indent run
231.4Srilligvoid
241.4Srilligfunction(void)
251.4Srillig{
261.4Srillig	switch (expr) {
271.4Srillig	case 1:	;
281.4Srillig	case 2:
291.4Srillig		break;
301.4Srillig	default:
311.4Srillig		switch (inner) {
321.4Srillig		case 4:
331.4Srillig			break;
341.4Srillig		}
351.4Srillig	}
361.4Srillig}
371.6Srillig//indent end
381.3Srillig
391.3Srillig
401.3Srillig/*
411.3Srillig * If there is a '{' after a case label, it gets indented using tabs instead
421.3Srillig * of spaces. Indent does not necessarily insert a space in this situation,
431.3Srillig * which looks strange.
441.3Srillig */
451.6Srillig//indent input
461.3Srilligvoid
471.3Srilligfunction(void)
481.3Srillig{
491.3Srillig	switch (expr) {
501.3Srillig	case 1: {
511.3Srillig		break;
521.3Srillig	}
531.3Srillig	case 11: {
541.3Srillig		break;
551.3Srillig	}
561.3Srillig	}
571.3Srillig}
581.6Srillig//indent end
591.3Srillig
601.6Srillig//indent run
611.3Srilligvoid
621.3Srilligfunction(void)
631.3Srillig{
641.3Srillig	switch (expr) {
651.3Srillig	/* $ The space between the ':' and the '{' is actually a tab. */
661.3Srillig	case 1:	{
671.3Srillig			break;
681.3Srillig		}
691.3Srillig	/* $ FIXME: missing space between ':' and '{'. */
701.3Srillig	case 11:{
711.3Srillig			break;
721.3Srillig		}
731.3Srillig	}
741.3Srillig}
751.6Srillig//indent end
761.4Srillig
771.4Srillig
781.4Srillig/*
791.4Srillig * Since C11, the _Generic selection expression allows a switch on the data
801.4Srillig * type of an expression.
811.4Srillig */
821.6Srillig//indent input
831.4Srilligconst char *type_name = _Generic(
841.4Srillig	' ',
851.4Srillig	int: "character constants have type 'int'",
861.4Srillig	char: "character constants have type 'char'",
871.4Srillig	default: "character constants have some other type"
881.4Srillig);
891.6Srillig//indent end
901.4Srillig
911.6Srillig//indent run -di0
921.4Srilligconst char *type_name = _Generic(
931.4Srillig// $ XXX: It's strange to align the arguments at the parenthesis even though
941.4Srillig// $ XXX: the first argument is already on a separate line.
951.4Srillig				 ' ',
961.4Srillig// $ TODO: indent the type names
971.4Srilligint:				 "character constants have type 'int'",
981.4Srilligchar:				 "character constants have type 'char'",
991.4Srilligdefault:
1001.4Srillig// $ TODO: remove the newline after 'default:'
1011.4Srillig				 "character constants have some other type"
1021.4Srillig);
1031.6Srillig//indent end
1041.4Srillig
1051.6Srillig//indent run -di0 -nlp
1061.4Srilligconst char *type_name = _Generic(
1071.4Srillig	' ',
1081.4Srillig// $ TODO: indent the type names
1091.4Srilligint:	"character constants have type 'int'",
1101.4Srilligchar:	"character constants have type 'char'",
1111.4Srilligdefault:
1121.4Srillig	"character constants have some other type"
1131.4Srillig);
1141.6Srillig//indent end
115