lsym_case_label.c revision 1.6
11.6Srillig/* $NetBSD: lsym_case_label.c,v 1.6 2022/04/24 09:04:12 rillig Exp $ */
21.1Srillig
31.1Srillig/*
41.1Srillig * Tests for the token lsym_case_label, which represents either the keyword
51.1Srillig * 'case' or the keyword 'default', which are both used in 'switch'
61.1Srillig * statements.
71.1Srillig *
81.1Srillig * Since C11, the keyword 'default' is used in _Generic selections as well.
91.1Srillig *
101.1Srillig * See also:
111.2Srillig *	opt_cli.c
121.1Srillig *	psym_switch_expr.c
131.1Srillig *	C11 6.5.1.1		"Generic selection"
141.1Srillig */
151.1Srillig
161.4Srillig/*
171.4Srillig * A case label can be used in a 'switch' statement.
181.4Srillig */
191.6Srillig//indent input
201.4Srilligvoid function(void){switch(expr){case 1:;case 2:break;default:switch(inner){case 4:break;}}}
211.6Srillig//indent end
221.1Srillig
231.6Srillig//indent run
241.4Srilligvoid
251.4Srilligfunction(void)
261.4Srillig{
271.4Srillig	switch (expr) {
281.4Srillig	case 1:	;
291.4Srillig	case 2:
301.4Srillig		break;
311.4Srillig	default:
321.4Srillig		switch (inner) {
331.4Srillig		case 4:
341.4Srillig			break;
351.4Srillig		}
361.4Srillig	}
371.4Srillig}
381.6Srillig//indent end
391.3Srillig
401.3Srillig
411.3Srillig/*
421.3Srillig * If there is a '{' after a case label, it gets indented using tabs instead
431.3Srillig * of spaces. Indent does not necessarily insert a space in this situation,
441.3Srillig * which looks strange.
451.3Srillig */
461.6Srillig//indent input
471.3Srilligvoid
481.3Srilligfunction(void)
491.3Srillig{
501.3Srillig	switch (expr) {
511.3Srillig	case 1: {
521.3Srillig		break;
531.3Srillig	}
541.3Srillig	case 11: {
551.3Srillig		break;
561.3Srillig	}
571.3Srillig	}
581.3Srillig}
591.6Srillig//indent end
601.3Srillig
611.6Srillig//indent run
621.3Srilligvoid
631.3Srilligfunction(void)
641.3Srillig{
651.3Srillig	switch (expr) {
661.3Srillig	/* $ The space between the ':' and the '{' is actually a tab. */
671.3Srillig	case 1:	{
681.3Srillig			break;
691.3Srillig		}
701.3Srillig	/* $ FIXME: missing space between ':' and '{'. */
711.3Srillig	case 11:{
721.3Srillig			break;
731.3Srillig		}
741.3Srillig	}
751.3Srillig}
761.6Srillig//indent end
771.4Srillig
781.4Srillig
791.4Srillig/*
801.4Srillig * Since C11, the _Generic selection expression allows a switch on the data
811.4Srillig * type of an expression.
821.4Srillig */
831.6Srillig//indent input
841.4Srilligconst char *type_name = _Generic(
851.4Srillig	' ',
861.4Srillig	int: "character constants have type 'int'",
871.4Srillig	char: "character constants have type 'char'",
881.4Srillig	default: "character constants have some other type"
891.4Srillig);
901.6Srillig//indent end
911.4Srillig
921.6Srillig//indent run -di0
931.4Srilligconst char *type_name = _Generic(
941.4Srillig// $ XXX: It's strange to align the arguments at the parenthesis even though
951.4Srillig// $ XXX: the first argument is already on a separate line.
961.4Srillig				 ' ',
971.4Srillig// $ TODO: indent the type names
981.4Srilligint:				 "character constants have type 'int'",
991.4Srilligchar:				 "character constants have type 'char'",
1001.4Srilligdefault:
1011.4Srillig// $ TODO: remove the newline after 'default:'
1021.4Srillig				 "character constants have some other type"
1031.4Srillig);
1041.6Srillig//indent end
1051.4Srillig
1061.6Srillig//indent run -di0 -nlp
1071.4Srilligconst char *type_name = _Generic(
1081.4Srillig	' ',
1091.4Srillig// $ TODO: indent the type names
1101.4Srilligint:	"character constants have type 'int'",
1111.4Srilligchar:	"character constants have type 'char'",
1121.4Srilligdefault:
1131.4Srillig	"character constants have some other type"
1141.4Srillig);
1151.6Srillig//indent end
116