lsym_case_label.c revision 1.6
1/* $NetBSD: lsym_case_label.c,v 1.6 2022/04/24 09:04:12 rillig Exp $ */
2
3/*
4 * Tests for the token lsym_case_label, which represents either the keyword
5 * 'case' or the keyword 'default', which are both used in 'switch'
6 * statements.
7 *
8 * Since C11, the keyword 'default' is used in _Generic selections as well.
9 *
10 * See also:
11 *	opt_cli.c
12 *	psym_switch_expr.c
13 *	C11 6.5.1.1		"Generic selection"
14 */
15
16/*
17 * A case label can be used in a 'switch' statement.
18 */
19//indent input
20void function(void){switch(expr){case 1:;case 2:break;default:switch(inner){case 4:break;}}}
21//indent end
22
23//indent run
24void
25function(void)
26{
27	switch (expr) {
28	case 1:	;
29	case 2:
30		break;
31	default:
32		switch (inner) {
33		case 4:
34			break;
35		}
36	}
37}
38//indent end
39
40
41/*
42 * If there is a '{' after a case label, it gets indented using tabs instead
43 * of spaces. Indent does not necessarily insert a space in this situation,
44 * which looks strange.
45 */
46//indent input
47void
48function(void)
49{
50	switch (expr) {
51	case 1: {
52		break;
53	}
54	case 11: {
55		break;
56	}
57	}
58}
59//indent end
60
61//indent run
62void
63function(void)
64{
65	switch (expr) {
66	/* $ The space between the ':' and the '{' is actually a tab. */
67	case 1:	{
68			break;
69		}
70	/* $ FIXME: missing space between ':' and '{'. */
71	case 11:{
72			break;
73		}
74	}
75}
76//indent end
77
78
79/*
80 * Since C11, the _Generic selection expression allows a switch on the data
81 * type of an expression.
82 */
83//indent input
84const char *type_name = _Generic(
85	' ',
86	int: "character constants have type 'int'",
87	char: "character constants have type 'char'",
88	default: "character constants have some other type"
89);
90//indent end
91
92//indent run -di0
93const char *type_name = _Generic(
94// $ XXX: It's strange to align the arguments at the parenthesis even though
95// $ XXX: the first argument is already on a separate line.
96				 ' ',
97// $ TODO: indent the type names
98int:				 "character constants have type 'int'",
99char:				 "character constants have type 'char'",
100default:
101// $ TODO: remove the newline after 'default:'
102				 "character constants have some other type"
103);
104//indent end
105
106//indent run -di0 -nlp
107const char *type_name = _Generic(
108	' ',
109// $ TODO: indent the type names
110int:	"character constants have type 'int'",
111char:	"character constants have type 'char'",
112default:
113	"character constants have some other type"
114);
115//indent end
116