blob: 4b06d55ba5944b8b9deeb49724322ba3042720fd [file] [log] [blame]
Douglas Gregor4abc32d2010-05-20 23:20:59 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3// <rdar://problem/7971948>
4struct A {};
5struct B {
Douglas Gregor0d0a9652010-12-23 22:56:40 +00006 void foo(int b) {
Douglas Gregor4abc32d2010-05-20 23:20:59 +00007 switch (a) { // expected-error{{use of undeclared identifier 'a'}}
8 default:
9 return;
10 }
Douglas Gregor0d0a9652010-12-23 22:56:40 +000011
12 switch (b) {
13 case 17 // expected-error{{expected ':' after 'case'}}
14 break;
15
16 default // expected-error{{expected ':' after 'default'}}
17 return;
18 }
Douglas Gregor4abc32d2010-05-20 23:20:59 +000019 }
John McCall0140bfe2011-01-22 09:28:32 +000020
21 void test2() {
22 enum X { Xa, Xb } x;
23
24 switch (x) { // expected-warning {{enumeration value 'Xb' not handled in switch}}
25 case Xa; // expected-error {{expected ':' after 'case'}}
26 break;
27 }
28
29 switch (x) {
30 default; // expected-error {{expected ':' after 'default'}}
31 break;
32 }
33 }
Richard Trieu2c850c02011-04-21 21:44:26 +000034
35 int test3(int i) {
36 switch (i) {
37 case 1: return 0;
38 2: return 1; // expected-error {{expected 'case' keyword before expression}}
39 default: return 5;
40 }
41 }
Douglas Gregor4abc32d2010-05-20 23:20:59 +000042};
Richard Trieu2c850c02011-04-21 21:44:26 +000043
44int test4(int i) {
45 switch (i)
46 1: return -1; // expected-error {{expected 'case' keyword before expression}}
47 return 0;
48}
49
50int test5(int i) {
51 switch (i) {
52 case 1: case 2: case 3: return 1;
53 {
54 4:5:6:7: return 2; // expected-error 4{{expected 'case' keyword before expression}}
55 }
56 default: return -1;
57 }
58}
59
60int test6(int i) {
61 switch (i) {
62 case 1:
63 case 4:
64 // This class provides extra single colon tokens. Make sure no
65 // errors are seen here.
66 class foo{
67 public:
68 protected:
69 private:
70 };
71 case 2:
72 5: // expected-error {{expected 'case' keyword before expression}}
73 default: return 1;
74 }
75}
76
77int test7(int i) {
78 switch (i) {
79 case false ? 1 : 2:
80 true ? 1 : 2: // expected-error {{expected 'case' keyword before expression}}
81 case 10:
Chandler Carruth2b949c22011-08-18 02:04:29 +000082 14 ? 3 : 4; // expected-warning {{expression result unused}}
Richard Trieu2c850c02011-04-21 21:44:26 +000083 default:
84 return 1;
85 }
86}
87
88enum foo { A, B, C};
89int test8( foo x ) {
90 switch (x) {
91 A: return 0; // FIXME: give a warning for unused labels that could also be
92 // a case expression.
93 default: return 1;
94 }
95}
96
97// Stress test to make sure Clang doesn't crash.
Kaelyn Uhrain8aa8da82013-10-19 00:05:00 +000098void test9(int x) { // expected-note {{'x' declared here}}
Richard Trieu2c850c02011-04-21 21:44:26 +000099 switch(x) {
100 case 1: return;
101 2: case; // expected-error {{expected 'case' keyword before expression}} \
102 expected-error {{expected expression}}
103 4:5:6: return; // expected-error 3{{expected 'case' keyword before expression}}
104 7: :x; // expected-error {{expected 'case' keyword before expression}} \
105 expected-error {{expected expression}}
106 8:: x; // expected-error {{expected ';' after expression}} \
Kaelyn Uhrain8aa8da82013-10-19 00:05:00 +0000107 expected-error {{no member named 'x' in the global namespace; did you mean simply 'x'?}} \
108 expected-warning 2 {{expression result unused}}
Richard Trieu2c850c02011-04-21 21:44:26 +0000109 9:: :y; // expected-error {{expected ';' after expression}} \
110 expected-error {{expected unqualified-id}} \
111 expected-warning {{expression result unused}}
112 :; // expected-error {{expected expression}}
113 ::; // expected-error {{expected unqualified-id}}
114 }
115}
116
117void test10(int x) {
118 switch (x) {
119 case 1: {
120 struct Inner {
121 void g(int y) {
122 2: y++; // expected-error {{expected ';' after expression}} \
123 // expected-warning {{expression result unused}}
124 }
125 };
126 break;
127 }
128 }
129}
130
131template<typename T>
132struct test11 {
133 enum { E };
134
135 void f(int x) {
136 switch (x) {
137 E: break; // FIXME: give a 'case' fix-it for unused labels that
138 // could also be an expression an a case label.
139 E+1: break; // expected-error {{expected 'case' keyword before expression}}
140 }
141 }
142};
143
144void test12(int x) {
145 switch (x) {
146 0: // expected-error {{expected 'case' keyword before expression}}
147 while (x) {
148 1: // expected-error {{expected 'case' keyword before expression}}
149 for (;x;) {
150 2: // expected-error {{expected 'case' keyword before expression}}
151 if (x > 0) {
152 3: // expected-error {{expected 'case' keyword before expression}}
153 --x;
154 }
155 }
156 }
157 }
158}
David Majnemer0ac67fa2011-06-13 05:50:12 +0000159
160void missing_statement_case(int x) {
161 switch (x) {
162 case 1:
163 case 0: // expected-error {{label at end of compound statement: expected statement}}
164 }
165}
166
167void missing_statement_default(int x) {
168 switch (x) {
169 case 0:
170 default: // expected-error {{label at end of compound statement: expected statement}}
171 }
172}
Serge Pavlov921c2ba2014-05-21 14:48:43 +0000173
174void pr19022_1() {
175 switch (int x) // expected-error {{variable declaration in condition must have an initializer}}
176 case v: ; // expected-error {{use of undeclared identifier 'v'}}
177}
178
179void pr19022_1a(int x) {
180 switch(x) {
181 case 1 // expected-error{{expected ':' after 'case'}} \
182 // expected-error{{label at end of compound statement: expected statement}}
183 }
184}
185
186void pr19022_1b(int x) {
187 switch(x) {
188 case v // expected-error{{use of undeclared identifier 'v'}}
189 }
190 }
191
192void pr19022_2() {
193 switch (int x) // expected-error {{variable declaration in condition must have an initializer}}
194 case v1: case v2: ; // expected-error {{use of undeclared identifier 'v1'}} \
195 // expected-error {{use of undeclared identifier 'v2'}}
196}
197
198void pr19022_3(int x) {
199 switch (x)
200 case 1: case v2: ; // expected-error {{use of undeclared identifier 'v2'}}
201}
202
203int pr19022_4(int x) {
204 switch(x) {
205 case 1 // expected-error{{expected ':' after 'case'}} expected-note{{previous case defined here}}
206 case 1 : return x; // expected-error{{duplicate case value '1'}}
207 }
208}
209
210void pr19022_5(int x) {
211 switch(x) {
212 case 1: case
213 } // expected-error{{expected expression}}
214}
215
216namespace pr19022 {
217int baz5() {}
218bool bar0() {
219 switch (int foo0) //expected-error{{variable declaration in condition must have an initializer}}
220 case bar5: ; // expected-error{{use of undeclared identifier 'bar5'}}
221}
222}
David Majnemer418ad3f2014-12-15 07:46:12 +0000223
224namespace pr21841 {
225void fn1() {
226 switch (0)
227 switch (0 // expected-note{{to match this '('}}
228 { // expected-error{{expected ')'}}
229 }
230} // expected-error{{expected statement}}
231}