blob: 96a6eb6e9632d01e45b58711646508671573f0e5 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %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}}
12 case 42: // expected-error {{duplicate case value}}
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;
John McCall0fb97082010-05-18 03:19:21 +000027 switch (0); // expected-warning {{no case matching constant switch condition '0'}}
Chris Lattnerf3348502007-08-23 14:29:07 +000028}
29
Anders Carlsson51fe9962008-11-22 21:04:56 +000030extern int g();
31
32void test4()
33{
John McCall0fb97082010-05-18 03:19:21 +000034 int cond;
35 switch (cond) {
Anders Carlsson51fe9962008-11-22 21:04:56 +000036 case 0 && g():
37 case 1 || g():
38 break;
39 }
40
John McCall0fb97082010-05-18 03:19:21 +000041 switch(cond) {
Anders Carlssond3a61d52008-12-01 02:13:02 +000042 case g(): // expected-error {{expression is not an integer constant expression}}
43 case 0 ... g(): // expected-error {{expression is not an integer constant expression}}
Anders Carlsson51fe9962008-11-22 21:04:56 +000044 break;
45 }
46
John McCall0fb97082010-05-18 03:19:21 +000047 switch (cond) {
Anders Carlsson51fe9962008-11-22 21:04:56 +000048 case 0 && g() ... 1 || g():
49 break;
50 }
Anders Carlsson6dde0d52008-11-22 21:50:49 +000051
John McCall0fb97082010-05-18 03:19:21 +000052 switch (cond) {
Chris Lattnerb7690b42010-07-24 01:10:11 +000053 case g() && 0: // expected-error {{expression is not an integer constant expression}} // expected-note {{subexpression not valid in an integer constant expression}}
Anders Carlsson6dde0d52008-11-22 21:50:49 +000054 break;
55 }
56
John McCall0fb97082010-05-18 03:19:21 +000057 switch (cond) {
Chris Lattnerb7690b42010-07-24 01:10:11 +000058 case 0 ... g() || 1: // expected-error {{expression is not an integer constant expression}} // expected-note {{subexpression not valid in an integer constant expression}}
Anders Carlsson6dde0d52008-11-22 21:50:49 +000059 break;
60 }
Anders Carlsson51fe9962008-11-22 21:04:56 +000061}
62
Chris Lattner5f4a6822008-11-23 23:12:31 +000063void test5(int z) {
64 switch(z) {
65 default: // expected-note {{previous case defined here}}
66 default: // expected-error {{multiple default labels in one switch}}
67 break;
68 }
69}
70
Chris Lattner5f048812009-10-16 16:45:22 +000071void test6() {
John McCall0fb97082010-05-18 03:19:21 +000072 char ch = 'a';
Chris Lattner5f048812009-10-16 16:45:22 +000073 switch(ch) {
74 case 1234: // expected-warning {{overflow converting case value}}
75 break;
76 }
77}
Douglas Gregorbe724ba2009-11-25 06:20:02 +000078
79// PR5606
Douglas Gregore24b5752010-10-14 20:34:08 +000080int f0(int var) {
Douglas Gregorbe724ba2009-11-25 06:20:02 +000081 switch (va) { // expected-error{{use of undeclared identifier 'va'}}
82 case 1:
83 break;
84 case 2:
85 return 1;
86 }
87 return 2;
88}
Douglas Gregorba915af2010-02-08 22:24:16 +000089
90void test7() {
91 enum {
92 A = 1,
93 B
94 } a;
95 switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
96 case A:
97 break;
98 }
99 switch(a) {
100 case B:
101 case A:
102 break;
103 }
104 switch(a) {
105 case A:
106 case B:
107 case 3: // expected-warning{{case value not in enumerated type ''}}
108 break;
109 }
110 switch(a) {
111 case A:
112 case B:
113 case 3 ... //expected-warning{{case value not in enumerated type ''}}
114 4: //expected-warning{{case value not in enumerated type ''}}
115 break;
116 }
117 switch(a) {
118 case 1 ... 2:
119 break;
120 }
121 switch(a) {
122 case 0 ... 2: //expected-warning{{case value not in enumerated type ''}}
123 break;
124 }
125 switch(a) {
126 case 1 ... 3: //expected-warning{{case value not in enumerated type ''}}
127 break;
128 }
129 switch(a) {
130 case 0 ... //expected-warning{{case value not in enumerated type ''}}
131 3: //expected-warning{{case value not in enumerated type ''}}
132 break;
133 }
134
135}
136
137void test8() {
138 enum {
139 A,
140 B,
141 C = 1
142 } a;
143 switch(a) {
144 case A:
145 case B:
146 break;
147 }
148 switch(a) {
149 case A:
150 case C:
151 break;
152 }
153 switch(a) { //expected-warning{{enumeration value 'B' not handled in switch}}
154 case A:
155 break;
156 }
157}
158
159void test9() {
160 enum {
161 A = 3,
162 C = 1
163 } a;
164 switch(a) {
165 case 0: //expected-warning{{case value not in enumerated type ''}}
166 case 1:
167 case 2: //expected-warning{{case value not in enumerated type ''}}
168 case 3:
169 case 4: //expected-warning{{case value not in enumerated type ''}}
170 break;
171 }
172}
173
174void test10() {
175 enum {
176 A = 10,
177 C = 2,
178 B = 4,
179 D = 12
180 } a;
181 switch(a) {
182 case 0 ... //expected-warning{{case value not in enumerated type ''}}
183 1: //expected-warning{{case value not in enumerated type ''}}
184 case 2 ... 4:
185 case 5 ... //expected-warning{{case value not in enumerated type ''}}
186 9: //expected-warning{{case value not in enumerated type ''}}
187 case 10 ... 12:
188 case 13 ... //expected-warning{{case value not in enumerated type ''}}
189 16: //expected-warning{{case value not in enumerated type ''}}
190 break;
191 }
192}
193
194void test11() {
195 enum {
196 A = -1,
197 B,
198 C
199 } a;
200 switch(a) { //expected-warning{{enumeration value 'A' not handled in switch}}
201 case B:
202 case C:
203 break;
204 }
205
206 switch(a) {
207 case B:
208 case C:
209 break;
210
211 default:
212 break;
213 }
214}
215
216void test12() {
217 enum {
218 A = -1,
219 B = 4294967286
220 } a;
221 switch(a) {
222 case A:
223 case B:
224 break;
225 }
226}
Douglas Gregor30ab3712010-02-17 23:29:11 +0000227
228// <rdar://problem/7643909>
229typedef enum {
230 val1,
231 val2,
232 val3
233} my_type_t;
234
235int test13(my_type_t t) {
236 switch(t) { // expected-warning{{enumeration value 'val3' not handled in switch}}
237 case val1:
238 return 1;
239 case val2:
240 return 2;
241 }
242 return -1;
243}
Douglas Gregor2853eac2010-02-18 00:56:01 +0000244
245// <rdar://problem/7658121>
246enum {
247 EC0 = 0xFFFF0000,
248 EC1 = 0xFFFF0001,
249};
250
251int test14(int a) {
252 switch(a) {
253 case EC0: return 0;
254 case EC1: return 1;
255 }
256 return 0;
257}
Douglas Gregorf9f627d2010-03-01 01:04:55 +0000258
259void f1(unsigned x) {
260 switch (x) {
261 case -1: break;
262 default: break;
263 }
264}
John McCall0fb97082010-05-18 03:19:21 +0000265
266void test15() {
267 int i = 0;
268 switch (1) { // expected-warning {{no case matching constant switch condition '1'}}
269 case 0: i = 0; break;
270 case 2: i++; break;
271 }
272}
273
274void test16() {
275 const char c = '5';
276 switch (c) { // expected-warning {{no case matching constant switch condition '53'}}
277 case '6': return;
278 }
279}
John McCall6907fbe2010-06-12 01:56:02 +0000280
281// PR7359
282void test17(int x) {
283 switch (x >= 17) { // expected-warning {{switch condition has boolean value}}
284 case 0: return;
285 }
286
287 switch ((int) (x <= 17)) {
288 case 0: return;
289 }
290}