1 // RUN: %clang_cc1 -fsyntax-only -verify %s
f(int z)2 void f (int z) {
3 while (z) {
4 default: z--; // expected-error {{statement not in switch}}
5 }
6 }
7
foo(int X)8 void foo(int X) {
9 switch (X) {
10 case 42: ; // expected-note {{previous case}}
11 case 5000000000LL: // expected-warning {{overflow}}
12 case 42: // expected-error {{duplicate case value}}
13 ;
14
15 case 100 ... 99: ; // expected-warning {{empty case range}}
16
17 case 43: ; // expected-note {{previous case}}
18 case 43 ... 45: ; // expected-error {{duplicate case value}}
19
20 case 100 ... 20000:; // expected-note {{previous case}}
21 case 15000 ... 40000000:; // expected-error {{duplicate case value}}
22 }
23 }
24
test3(void)25 void test3(void) {
26 // empty switch;
27 switch (0); // expected-warning {{no case matching constant switch condition '0'}}
28 }
29
30 extern int g();
31
test4()32 void test4()
33 {
34 int cond;
35 switch (cond) {
36 case 0 && g():
37 case 1 || g():
38 break;
39 }
40
41 switch(cond) {
42 case g(): // expected-error {{expression is not an integer constant expression}}
43 case 0 ... g(): // expected-error {{expression is not an integer constant expression}}
44 break;
45 }
46
47 switch (cond) {
48 case 0 && g() ... 1 || g():
49 break;
50 }
51
52 switch (cond) {
53 case g() && 0: // expected-error {{expression is not an integer constant expression}} // expected-note {{subexpression not valid in an integer constant expression}}
54 break;
55 }
56
57 switch (cond) {
58 case 0 ... g() || 1: // expected-error {{expression is not an integer constant expression}} // expected-note {{subexpression not valid in an integer constant expression}}
59 break;
60 }
61 }
62
test5(int z)63 void test5(int z) {
64 switch(z) {
65 default: // expected-note {{previous case defined here}}
66 default: // expected-error {{multiple default labels in one switch}}
67 break;
68 }
69 }
70
test6()71 void test6() {
72 char ch = 'a';
73 switch(ch) {
74 case 1234: // expected-warning {{overflow converting case value}}
75 break;
76 }
77 }
78
79 // PR5606
f0(int var)80 int f0(int var) {
81 switch (va) { // expected-error{{use of undeclared identifier 'va'}}
82 case 1:
83 break;
84 case 2:
85 return 1;
86 }
87 return 2;
88 }
89
test7()90 void test7() {
91 enum {
92 A = 1,
93 B
94 } a;
95 switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
96 case A:
97 break;
98 }
99 switch(a) {
100 case B:
101 case A:
102 break;
103 }
104 switch(a) {
105 case A:
106 case B:
107 case 3: // expected-warning{{case value not in enumerated type ''}}
108 break;
109 }
110 switch(a) {
111 case A:
112 case B:
113 case 3 ... //expected-warning{{case value not in enumerated type ''}}
114 4: //expected-warning{{case value not in enumerated type ''}}
115 break;
116 }
117 switch(a) {
118 case 1 ... 2:
119 break;
120 }
121 switch(a) {
122 case 0 ... 2: //expected-warning{{case value not in enumerated type ''}}
123 break;
124 }
125 switch(a) {
126 case 1 ... 3: //expected-warning{{case value not in enumerated type ''}}
127 break;
128 }
129 switch(a) {
130 case 0 ... //expected-warning{{case value not in enumerated type ''}}
131 3: //expected-warning{{case value not in enumerated type ''}}
132 break;
133 }
134
135 }
136
test8()137 void test8() {
138 enum {
139 A,
140 B,
141 C = 1
142 } a;
143 switch(a) {
144 case A:
145 case B:
146 break;
147 }
148 switch(a) {
149 case A:
150 case C:
151 break;
152 }
153 switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
154 case A:
155 break;
156 }
157 }
158
test9()159 void test9() {
160 enum {
161 A = 3,
162 C = 1
163 } a;
164 switch(a) {
165 case 0: //expected-warning{{case value not in enumerated type ''}}
166 case 1:
167 case 2: //expected-warning{{case value not in enumerated type ''}}
168 case 3:
169 case 4: //expected-warning{{case value not in enumerated type ''}}
170 break;
171 }
172 }
173
test10()174 void test10() {
175 enum {
176 A = 10,
177 C = 2,
178 B = 4,
179 D = 12
180 } a;
181 switch(a) {
182 case 0 ... //expected-warning{{case value not in enumerated type ''}}
183 1: //expected-warning{{case value not in enumerated type ''}}
184 case 2 ... 4:
185 case 5 ... //expected-warning{{case value not in enumerated type ''}}
186 9: //expected-warning{{case value not in enumerated type ''}}
187 case 10 ... 12:
188 case 13 ... //expected-warning{{case value not in enumerated type ''}}
189 16: //expected-warning{{case value not in enumerated type ''}}
190 break;
191 }
192 }
193
test11()194 void test11() {
195 enum {
196 A = -1,
197 B,
198 C
199 } a;
200 switch(a) { //expected-warning{{enumeration value 'A' not handled in switch}}
201 case B:
202 case C:
203 break;
204 }
205
206 switch(a) {
207 case B:
208 case C:
209 break;
210
211 default:
212 break;
213 }
214 }
215
test12()216 void test12() {
217 enum {
218 A = -1,
219 B = 4294967286
220 } a;
221 switch(a) {
222 case A:
223 case B:
224 break;
225 }
226 }
227
228 // <rdar://problem/7643909>
229 typedef enum {
230 val1,
231 val2,
232 val3
233 } my_type_t;
234
test13(my_type_t t)235 int test13(my_type_t t) {
236 switch(t) { // expected-warning{{enumeration value 'val3' not handled in switch}}
237 case val1:
238 return 1;
239 case val2:
240 return 2;
241 }
242 return -1;
243 }
244
245 // <rdar://problem/7658121>
246 enum {
247 EC0 = 0xFFFF0000,
248 EC1 = 0xFFFF0001,
249 };
250
test14(int a)251 int test14(int a) {
252 switch(a) {
253 case EC0: return 0;
254 case EC1: return 1;
255 }
256 return 0;
257 }
258
f1(unsigned x)259 void f1(unsigned x) {
260 switch (x) {
261 case -1: break;
262 default: break;
263 }
264 }
265
test15()266 void test15() {
267 int i = 0;
268 switch (1) { // expected-warning {{no case matching constant switch condition '1'}}
269 case 0: i = 0; break;
270 case 2: i++; break;
271 }
272 }
273
test16()274 void test16() {
275 const char c = '5';
276 switch (c) { // expected-warning {{no case matching constant switch condition '53'}}
277 case '6': return;
278 }
279 }
280
281 // PR7359
test17(int x)282 void test17(int x) {
283 switch (x >= 17) { // expected-warning {{switch condition has boolean value}}
284 case 0: return;
285 }
286
287 switch ((int) (x <= 17)) {
288 case 0: return;
289 }
290 }
291