1 // RUN: %clang_cc1 -fsyntax-only -verify -Wswitch-enum -Wcovered-switch-default -triple x86_64-linux-gnu %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 '42'}}
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               // expected-warning {{switch statement has empty body}} \
29               // expected-note{{put the semicolon on a separate line to silence this warning}}
30 }
31 
32 extern int g();
33 
test4()34 void test4()
35 {
36   int cond;
37   switch (cond) {
38   case 0 && g():
39   case 1 || g():
40     break;
41   }
42 
43   switch(cond)  {
44   case g(): // expected-error {{expression is not an integer constant expression}}
45   case 0 ... g(): // expected-error {{expression is not an integer constant expression}}
46     break;
47   }
48 
49   switch (cond) {
50   case 0 && g() ... 1 || g():
51     break;
52   }
53 
54   switch (cond) {
55   case g() // expected-error {{expression is not an integer constant expression}}
56       && 0:
57     break;
58   }
59 
60   switch (cond) {
61   case 0 ...
62       g() // expected-error {{expression is not an integer constant expression}}
63       || 1:
64     break;
65   }
66 }
67 
test5(int z)68 void test5(int z) {
69   switch(z) {
70     default:  // expected-note {{previous case defined here}}
71     default:  // expected-error {{multiple default labels in one switch}}
72       break;
73   }
74 }
75 
test6()76 void test6() {
77   char ch = 'a';
78   switch(ch) {
79     case 1234:  // expected-warning {{overflow converting case value}}
80       break;
81   }
82 }
83 
84 // PR5606
f0(int var)85 int f0(int var) {
86   switch (va) { // expected-error{{use of undeclared identifier 'va'}}
87   case 1:
88     break;
89   case 2:
90     return 1;
91   }
92   return 2;
93 }
94 
test7()95 void test7() {
96   enum {
97     A = 1,
98     B
99   } a;
100   switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
101     case A:
102       break;
103   }
104   switch(a) {
105     case B:
106     case A:
107       break;
108   }
109   switch(a) {
110     case A:
111     case B:
112     case 3: // expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
113       break;
114   }
115   switch(a) {
116     case A:
117     case B:
118     case 3 ... //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
119         4: //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
120       break;
121   }
122   switch(a) {
123     case 1 ... 2:
124       break;
125   }
126   switch(a) {
127     case 0 ... 2: //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
128       break;
129   }
130   switch(a) {
131     case 1 ... 3: //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
132       break;
133   }
134   switch(a) {
135     case 0 ...  //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
136       3:  //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
137       break;
138   }
139 
140 }
141 
test8()142 void test8() {
143   enum {
144     A,
145     B,
146     C = 1
147   } a;
148   switch(a) {
149     case A:
150     case B:
151      break;
152   }
153   switch(a) {
154     case A:
155     case C:
156       break;
157   }
158   switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
159     case A:
160       break;
161   }
162 }
163 
test9()164 void test9() {
165   enum {
166     A = 3,
167     C = 1
168   } a;
169   switch(a) {
170     case 0: //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
171     case 1:
172     case 2: //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
173     case 3:
174     case 4: //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
175       break;
176   }
177 }
178 
test10()179 void test10() {
180   enum {
181     A = 10,
182     C = 2,
183     B = 4,
184     D = 12
185   } a;
186   switch(a) {
187     case 0 ...  //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
188 	    1:  //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
189     case 2 ... 4:
190     case 5 ...  //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
191 	      9:  //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
192     case 10 ... 12:
193     case 13 ...  //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
194               16: //expected-warning{{case value not in enumerated type 'enum (unnamed enum}}
195       break;
196   }
197 }
198 
test11()199 void test11() {
200   enum {
201     A = -1,
202     B,
203     C
204   } a;
205   switch(a) { //expected-warning{{enumeration value 'A' not handled in switch}}
206     case B:
207     case C:
208       break;
209   }
210 
211   switch(a) { //expected-warning{{enumeration value 'A' not explicitly handled in switch}}
212     case B:
213     case C:
214       break;
215 
216     default:
217       break;
218   }
219 }
220 
test12()221 void test12() {
222   enum {
223     A = -1,
224     B = 4294967286
225   } a;
226   switch(a) {
227     case A:
228     case B:
229       break;
230   }
231 }
232 
233 // <rdar://problem/7643909>
234 typedef enum {
235     val1,
236     val2,
237     val3
238 } my_type_t;
239 
test13(my_type_t t)240 int test13(my_type_t t) {
241   switch(t) { // expected-warning{{enumeration value 'val3' not handled in switch}}
242   case val1:
243     return 1;
244   case val2:
245     return 2;
246   }
247   return -1;
248 }
249 
250 // <rdar://problem/7658121>
251 enum {
252   EC0 = 0xFFFF0000,
253   EC1 = 0xFFFF0001,
254 };
255 
test14(int a)256 int test14(int a) {
257   switch(a) {
258   case EC0: return 0;
259   case EC1: return 1;
260   }
261   return 0;
262 }
263 
f1(unsigned x)264 void f1(unsigned x) {
265   switch (x) {
266   case -1: break;
267   default: break;
268   }
269 }
270 
test15()271 void test15() {
272   int i = 0;
273   switch (1) { // expected-warning {{no case matching constant switch condition '1'}}
274   case 0: i = 0; break;
275   case 2: i++; break;
276   }
277 }
278 
test16()279 void test16() {
280   const char c = '5';
281   switch (c) { // expected-warning {{no case matching constant switch condition '53'}}
282   case '6': return;
283   }
284 }
285 
286 struct bitfield_member {
287   unsigned bf : 1;
288 };
289 
290 // PR7359
test17(int x)291 void test17(int x) {
292   switch (x >= 17) { // expected-warning {{switch condition has boolean value}}
293   case 0: return;
294   }
295 
296   switch ((int) (x <= 17)) {
297   case 0: return;
298   }
299 
300   struct bitfield_member bm;
301   switch (bm.bf) { // no warning
302   case 0:
303   case 1:
304     return;
305   }
306 }
307 
test18()308 int test18() {
309   enum { A, B } a;
310   switch (a) {
311   case A: return 0;
312   case B: return 1;
313   case 7: return 1; // expected-warning {{case value not in enumerated type}}
314   default: return 2; // expected-warning {{default label in switch which covers all enumeration values}}
315   }
316 }
317 
318 // rdar://110822110
319 typedef enum {
320         kOne = 1,
321 } Ints;
322 
rdar110822110(Ints i)323 void rdar110822110(Ints i)
324 {
325         switch (i) {
326                 case kOne:
327                         break;
328                 case 2: 	// expected-warning {{case value not in enumerated type 'Ints'}}
329                         break;
330                 default:	// expected-warning {{default label in switch which covers all enumeration values}}
331                         break;
332                 }
333 }
334 
335 // PR9243
336 #define TEST19MACRO 5
test19(int i)337 void test19(int i) {
338   enum {
339     kTest19Enum1 = 7,
340     kTest19Enum2 = kTest19Enum1
341   };
342   const int a = 3;
343   switch (i) {
344     case 5: // expected-note {{previous case}}
345     case TEST19MACRO: // expected-error {{duplicate case value '5'}}
346 
347     case 7: // expected-note {{previous case}}
348     case kTest19Enum1: // expected-error {{duplicate case value: '7' and 'kTest19Enum1' both equal '7'}} \
349                        // expected-note {{previous case}}
350     case kTest19Enum1: // expected-error {{duplicate case value 'kTest19Enum1'}} \
351                        // expected-note {{previous case}}
352     case kTest19Enum2: // expected-error {{duplicate case value: 'kTest19Enum1' and 'kTest19Enum2' both equal '7'}} \
353                        // expected-note {{previous case}}
354     case (int)kTest19Enum2: //expected-error {{duplicate case value 'kTest19Enum2'}}
355 
356     case 3: // expected-note {{previous case}}
357     case a: // expected-error {{duplicate case value: '3' and 'a' both equal '3'}} \
358             // expected-note {{previous case}}
359     case a: // expected-error {{duplicate case value 'a'}}
360       break;
361   }
362 }
363 
364 // Allow the warning 'case value not in enumerated type' to be silenced with
365 // the following pattern.
366 //
367 // If 'case' expression refers to a static const variable of the correct enum
368 // type, then we count this as a sufficient declaration of intent by the user,
369 // so we silence the warning.
370 enum ExtendedEnum1 {
371   EE1_a,
372   EE1_b
373 };
374 
375 enum ExtendedEnum1_unrelated { EE1_misc };
376 
377 static const enum ExtendedEnum1 EE1_c = 100;
378 static const enum ExtendedEnum1_unrelated EE1_d = 101;
379 
switch_on_ExtendedEnum1(enum ExtendedEnum1 e)380 void switch_on_ExtendedEnum1(enum ExtendedEnum1 e) {
381   switch(e) {
382   case EE1_a: break;
383   case EE1_b: break;
384   case EE1_c: break; // no-warning
385   case EE1_d: break; // expected-warning {{case value not in enumerated type 'enum ExtendedEnum1'}}
386   // expected-warning@-1 {{comparison of different enumeration types in switch statement ('enum ExtendedEnum1' and 'enum ExtendedEnum1_unrelated')}}
387   }
388 }
389 
PR11778(char c,int n,long long ll)390 void PR11778(char c, int n, long long ll) {
391   // Do not reject this; we don't have duplicate case values because we
392   // check for duplicates in the promoted type.
393   switch (c) case 1: case 257: ; // expected-warning {{overflow}}
394 
395   switch (n) case 0x100000001LL: case 1: ; // expected-warning {{overflow}} expected-error {{duplicate}} expected-note {{previous}}
396   switch ((int)ll) case 0x100000001LL: case 1: ; // expected-warning {{overflow}} expected-error {{duplicate}} expected-note {{previous}}
397   switch ((long long)n) case 0x100000001LL: case 1: ;
398   switch (ll) case 0x100000001LL: case 1: ;
399 }
400