1/* $NetBSD: lsym_case_label.c,v 1.11 2023/06/15 09:19:07 rillig Exp $ */
2
3/*
4 * Tests for the tokens lsym_case and lsym_default, which represent the
5 * keywords 'case' and 'default', which are both used in 'switch' statements.
6 *
7 * Since C11, the keyword 'default' is used in _Generic selections as well.
8 *
9 * See also:
10 *	opt_cli.c
11 *	psym_switch_expr.c
12 *	C11 6.5.1.1		"Generic selection"
13 */
14
15/*
16 * A case label can be used in a 'switch' statement.
17 */
18//indent input
19void function(void){switch(expr){case 1:;case 2:break;default:switch(inner){case 4:break;}}}
20//indent end
21
22//indent run
23void
24function(void)
25{
26	switch (expr) {
27	case 1:	;
28	case 2:
29		break;
30	default:
31		switch (inner) {
32		case 4:
33			break;
34		}
35	}
36}
37//indent end
38
39
40/*
41 * If there is a '{' after a case label, it gets indented using tabs instead
42 * of spaces. Indent does not necessarily insert a space in this situation,
43 * which looks strange.
44 */
45//indent input
46void
47function(void)
48{
49	switch (expr) {
50	case 1: {
51		break;
52	}
53	case 11: {
54		break;
55	}
56	}
57}
58//indent end
59
60//indent run
61void
62function(void)
63{
64	switch (expr) {
65	/* $ The space between the ':' and the '{' is actually a tab. */
66	case 1:	{
67			break;
68		}
69	case 11: {
70			break;
71		}
72	}
73}
74//indent end
75
76
77/*
78 * Since C11, the _Generic selection expression allows a switch on the data
79 * type of an expression.
80 */
81//indent input
82const char *type_name = _Generic(
83	' ',
84	int: "character constants have type 'int'",
85	char: "character constants have type 'char'",
86	default: "character constants have some other type"
87);
88//indent end
89
90//indent run -di0
91const char *type_name = _Generic(
92// $ XXX: It's strange to align the arguments at the parenthesis even though
93// $ XXX: the first argument is already on a separate line.
94				 ' ',
95// $ The indentation is so large that the strings would spill over the right
96// $ margin.  To prevent that, the code is right-aligned.  Since the base
97// $ indentation of this declaration is 0, the code might even start at the
98// $ beginning of the line.
99				 int: "character constants have type 'int'",
100			       char: "character constants have type 'char'",
101			 default: "character constants have some other type"
102);
103//indent end
104
105//indent run-equals-input -di0 -nlp
106
107
108/*
109 * Multi-line case expressions are rare but still should be processed in a
110 * sensible way.
111 */
112//indent input
113{
114	switch (expr) {
115// $ FIXME: The line containing the 'case' must be indented like a 'case'.
116		case 1
117		    + 2
118// $ FIXME: This continuation line must be indented by 4 columns.
119	+ 3:
120		stmt;
121	}
122}
123//indent end
124
125//indent run-equals-input -ci4
126