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