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