blob: e37d5da259269736e933b64d9aa5cceb74bac3ee [file] [log] [blame]
Ted Kremenek1a2b8e22012-02-08 05:08:58 +00001// RUN: %clang_cc1 -fsyntax-only -verify -Wswitch-enum -Wcovered-switch-default %s
Chris Lattner8a87e572007-07-23 17:05:23 +00002void f (int z) {
3 while (z) {
Chris Lattner0471f5b2007-08-23 18:29:20 +00004 default: z--; // expected-error {{statement not in switch}}
Chris Lattner8a87e572007-07-23 17:05:23 +00005 }
6}
7
Chris Lattnerf4021e72007-08-23 05:46:52 +00008void foo(int X) {
9 switch (X) {
Chris Lattner5f4a6822008-11-23 23:12:31 +000010 case 42: ; // expected-note {{previous case}}
Chris Lattner0471f5b2007-08-23 18:29:20 +000011 case 5000000000LL: // expected-warning {{overflow}}
Douglas Gregor3940ce82012-05-16 05:32:58 +000012 case 42: // expected-error {{duplicate case value '42'}}
Chris Lattnerf4021e72007-08-23 05:46:52 +000013 ;
Chris Lattner6efc4d32007-08-23 17:48:14 +000014
Chris Lattner0471f5b2007-08-23 18:29:20 +000015 case 100 ... 99: ; // expected-warning {{empty case range}}
16
Chris Lattner5f4a6822008-11-23 23:12:31 +000017 case 43: ; // expected-note {{previous case}}
Chris Lattner0471f5b2007-08-23 18:29:20 +000018 case 43 ... 45: ; // expected-error {{duplicate case value}}
19
Chris Lattner5f4a6822008-11-23 23:12:31 +000020 case 100 ... 20000:; // expected-note {{previous case}}
Chris Lattner0471f5b2007-08-23 18:29:20 +000021 case 15000 ... 40000000:; // expected-error {{duplicate case value}}
Chris Lattnerf4021e72007-08-23 05:46:52 +000022 }
23}
24
Chris Lattnerf3348502007-08-23 14:29:07 +000025void test3(void) {
Chris Lattner0471f5b2007-08-23 18:29:20 +000026 // empty switch;
Dmitri Gribenko625bb562012-02-14 22:14:32 +000027 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}}
Chris Lattnerf3348502007-08-23 14:29:07 +000030}
31
Anders Carlsson51fe9962008-11-22 21:04:56 +000032extern int g();
33
34void test4()
35{
John McCall0fb97082010-05-18 03:19:21 +000036 int cond;
37 switch (cond) {
Anders Carlsson51fe9962008-11-22 21:04:56 +000038 case 0 && g():
39 case 1 || g():
40 break;
41 }
42
John McCall0fb97082010-05-18 03:19:21 +000043 switch(cond) {
Anders Carlssond3a61d52008-12-01 02:13:02 +000044 case g(): // expected-error {{expression is not an integer constant expression}}
45 case 0 ... g(): // expected-error {{expression is not an integer constant expression}}
Anders Carlsson51fe9962008-11-22 21:04:56 +000046 break;
47 }
48
John McCall0fb97082010-05-18 03:19:21 +000049 switch (cond) {
Anders Carlsson51fe9962008-11-22 21:04:56 +000050 case 0 && g() ... 1 || g():
51 break;
52 }
Anders Carlsson6dde0d52008-11-22 21:50:49 +000053
John McCall0fb97082010-05-18 03:19:21 +000054 switch (cond) {
Richard Smith282e7e62012-02-04 09:53:13 +000055 case g() // expected-error {{expression is not an integer constant expression}}
56 && 0:
Anders Carlsson6dde0d52008-11-22 21:50:49 +000057 break;
58 }
59
John McCall0fb97082010-05-18 03:19:21 +000060 switch (cond) {
Richard Smith282e7e62012-02-04 09:53:13 +000061 case 0 ...
62 g() // expected-error {{expression is not an integer constant expression}}
63 || 1:
Anders Carlsson6dde0d52008-11-22 21:50:49 +000064 break;
65 }
Anders Carlsson51fe9962008-11-22 21:04:56 +000066}
67
Chris Lattner5f4a6822008-11-23 23:12:31 +000068void 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
Chris Lattner5f048812009-10-16 16:45:22 +000076void test6() {
John McCall0fb97082010-05-18 03:19:21 +000077 char ch = 'a';
Chris Lattner5f048812009-10-16 16:45:22 +000078 switch(ch) {
79 case 1234: // expected-warning {{overflow converting case value}}
80 break;
81 }
82}
Douglas Gregorbe724ba2009-11-25 06:20:02 +000083
84// PR5606
Douglas Gregore24b5752010-10-14 20:34:08 +000085int f0(int var) {
Douglas Gregorbe724ba2009-11-25 06:20:02 +000086 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}
Douglas Gregorba915af2010-02-08 22:24:16 +000094
95void 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:
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000112 case 3: // expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000113 break;
114 }
115 switch(a) {
116 case A:
117 case B:
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000118 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}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000120 break;
121 }
122 switch(a) {
123 case 1 ... 2:
124 break;
125 }
126 switch(a) {
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000127 case 0 ... 2: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000128 break;
129 }
130 switch(a) {
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000131 case 1 ... 3: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000132 break;
133 }
134 switch(a) {
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000135 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}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000137 break;
138 }
139
140}
141
142void 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
164void test9() {
165 enum {
166 A = 3,
167 C = 1
168 } a;
169 switch(a) {
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000170 case 0: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000171 case 1:
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000172 case 2: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000173 case 3:
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000174 case 4: //expected-warning{{case value not in enumerated type 'enum <anonymous enum}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000175 break;
176 }
177}
178
179void test10() {
180 enum {
181 A = 10,
182 C = 2,
183 B = 4,
184 D = 12
185 } a;
186 switch(a) {
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000187 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}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000189 case 2 ... 4:
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000190 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}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000192 case 10 ... 12:
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000193 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}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000195 break;
196 }
197}
198
199void 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
David Blaikiee1d82de2012-01-24 04:56:25 +0000211 switch(a) { //expected-warning{{enumeration value 'A' not explicitly handled in switch}}
Douglas Gregorba915af2010-02-08 22:24:16 +0000212 case B:
213 case C:
214 break;
215
216 default:
217 break;
218 }
219}
220
221void test12() {
222 enum {
223 A = -1,
224 B = 4294967286
225 } a;
226 switch(a) {
227 case A:
228 case B:
229 break;
230 }
231}
Douglas Gregor30ab3712010-02-17 23:29:11 +0000232
233// <rdar://problem/7643909>
234typedef enum {
235 val1,
236 val2,
237 val3
238} my_type_t;
239
240int 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}
Douglas Gregor2853eac2010-02-18 00:56:01 +0000249
250// <rdar://problem/7658121>
251enum {
252 EC0 = 0xFFFF0000,
253 EC1 = 0xFFFF0001,
254};
255
256int test14(int a) {
257 switch(a) {
258 case EC0: return 0;
259 case EC1: return 1;
260 }
261 return 0;
262}
Douglas Gregorf9f627d2010-03-01 01:04:55 +0000263
264void f1(unsigned x) {
265 switch (x) {
266 case -1: break;
267 default: break;
268 }
269}
John McCall0fb97082010-05-18 03:19:21 +0000270
271void 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
279void test16() {
280 const char c = '5';
281 switch (c) { // expected-warning {{no case matching constant switch condition '53'}}
282 case '6': return;
283 }
284}
John McCall6907fbe2010-06-12 01:56:02 +0000285
286// PR7359
287void 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}
David Blaikie31ceb612012-01-21 18:12:07 +0000296
297int test18() {
298 enum { A, B } a;
299 switch (a) {
300 case A: return 0;
301 case B: return 1;
David Blaikie93667502012-01-22 02:31:55 +0000302 case 7: return 1; // expected-warning {{case value not in enumerated type}}
David Blaikie2dd52e32012-01-24 05:34:08 +0000303 default: return 2; // expected-warning {{default label in switch which covers all enumeration values}}
David Blaikie93667502012-01-22 02:31:55 +0000304 }
305}
Fariborz Jahanian54faba42012-03-21 20:56:29 +0000306
307// rdar://110822110
308typedef enum {
309 kOne = 1,
310} Ints;
311
312void 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}
Douglas Gregor3940ce82012-05-16 05:32:58 +0000323
324// PR9243
325#define TEST19MACRO 5
326void test19(int i) {
327 enum {
328 kTest19Enum1 = 7,
Richard Trieu7af7de72012-05-30 01:01:11 +0000329 kTest19Enum2 = kTest19Enum1
Douglas Gregor3940ce82012-05-16 05:32:58 +0000330 };
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}