1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3// <rdar://problem/7971948>
4struct A {};
5struct B {
6  void foo(int b) {
7    switch (a) { // expected-error{{use of undeclared identifier 'a'}}
8    default:
9      return;
10    }
11
12    switch (b) {
13    case 17 // expected-error{{expected ':' after 'case'}}
14      break;
15
16    default // expected-error{{expected ':' after 'default'}}
17      return;
18    }
19  }
20
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  }
34
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  }
42};
43
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:
82      14 ? 3 : 4;  // expected-warning {{expression result unused}}
83    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.
98void test9(int x) { // expected-note {{'x' declared here}}
99  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}} \
107              expected-error {{no member named 'x' in the global namespace; did you mean simply 'x'?}} \
108              expected-warning 2 {{expression result unused}}
109    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}
159
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}
173
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}
223