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