• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 (anonymous 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 (anonymous enum}}
119         4: //expected-warning{{case value not in enumerated type 'enum (anonymous 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 (anonymous enum}}
128       break;
129   }
130   switch(a) {
131     case 1 ... 3: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
132       break;
133   }
134   switch(a) {
135     case 0 ...  //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
136       3:  //expected-warning{{case value not in enumerated type 'enum (anonymous 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 (anonymous enum}}
171     case 1:
172     case 2: //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
173     case 3:
174     case 4: //expected-warning{{case value not in enumerated type 'enum (anonymous 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 (anonymous enum}}
188 	    1:  //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
189     case 2 ... 4:
190     case 5 ...  //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
191 	      9:  //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
192     case 10 ... 12:
193     case 13 ...  //expected-warning{{case value not in enumerated type 'enum (anonymous enum}}
194               16: //expected-warning{{case value not in enumerated type 'enum (anonymous 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 // PR7359
test17(int x)287 void test17(int x) {
288   switch (x >= 17) { // expected-warning {{switch condition has boolean value}}
289   case 0: return;
290   }
291 
292   switch ((int) (x <= 17)) {
293   case 0: return;
294   }
295 }
296 
test18()297 int test18() {
298   enum { A, B } a;
299   switch (a) {
300   case A: return 0;
301   case B: return 1;
302   case 7: return 1; // expected-warning {{case value not in enumerated type}}
303   default: return 2; // expected-warning {{default label in switch which covers all enumeration values}}
304   }
305 }
306 
307 // rdar://110822110
308 typedef enum {
309         kOne = 1,
310 } Ints;
311 
rdar110822110(Ints i)312 void rdar110822110(Ints i)
313 {
314         switch (i) {
315                 case kOne:
316                         break;
317                 case 2: 	// expected-warning {{case value not in enumerated type 'Ints'}}
318                         break;
319                 default:	// expected-warning {{default label in switch which covers all enumeration values}}
320                         break;
321                 }
322 }
323 
324 // PR9243
325 #define TEST19MACRO 5
test19(int i)326 void test19(int i) {
327   enum {
328     kTest19Enum1 = 7,
329     kTest19Enum2 = kTest19Enum1
330   };
331   const int a = 3;
332   switch (i) {
333     case 5: // expected-note {{previous case}}
334     case TEST19MACRO: // expected-error {{duplicate case value '5'}}
335 
336     case 7: // expected-note {{previous case}}
337     case kTest19Enum1: // expected-error {{duplicate case value: '7' and 'kTest19Enum1' both equal '7'}} \
338                        // expected-note {{previous case}}
339     case kTest19Enum1: // expected-error {{duplicate case value 'kTest19Enum1'}} \
340                        // expected-note {{previous case}}
341     case kTest19Enum2: // expected-error {{duplicate case value: 'kTest19Enum1' and 'kTest19Enum2' both equal '7'}} \
342                        // expected-note {{previous case}}
343     case (int)kTest19Enum2: //expected-error {{duplicate case value 'kTest19Enum2'}}
344 
345     case 3: // expected-note {{previous case}}
346     case a: // expected-error {{duplicate case value: '3' and 'a' both equal '3'}} \
347             // expected-note {{previous case}}
348     case a: // expected-error {{duplicate case value 'a'}}
349       break;
350   }
351 }
352 
353 // Allow the warning 'case value not in enumerated type' to be silenced with
354 // the following pattern.
355 //
356 // If 'case' expression refers to a static const variable of the correct enum
357 // type, then we count this as a sufficient declaration of intent by the user,
358 // so we silence the warning.
359 enum ExtendedEnum1 {
360   EE1_a,
361   EE1_b
362 };
363 
364 enum ExtendedEnum1_unrelated { EE1_misc };
365 
366 static const enum ExtendedEnum1 EE1_c = 100;
367 static const enum ExtendedEnum1_unrelated EE1_d = 101;
368 
switch_on_ExtendedEnum1(enum ExtendedEnum1 e)369 void switch_on_ExtendedEnum1(enum ExtendedEnum1 e) {
370   switch(e) {
371   case EE1_a: break;
372   case EE1_b: break;
373   case EE1_c: break; // no-warning
374   case EE1_d: break; // expected-warning {{case value not in enumerated type 'enum ExtendedEnum1'}}
375   }
376 }
377 
PR11778(char c,int n,long long ll)378 void PR11778(char c, int n, long long ll) {
379   // Do not reject this; we don't have duplicate case values because we
380   // check for duplicates in the promoted type.
381   switch (c) case 1: case 257: ; // expected-warning {{overflow}}
382 
383   switch (n) case 0x100000001LL: case 1: ; // expected-warning {{overflow}} expected-error {{duplicate}} expected-note {{previous}}
384   switch ((int)ll) case 0x100000001LL: case 1: ; // expected-warning {{overflow}} expected-error {{duplicate}} expected-note {{previous}}
385   switch ((long long)n) case 0x100000001LL: case 1: ;
386   switch (ll) case 0x100000001LL: case 1: ;
387 }
388