| // RUN: %clang_cc1 -fsyntax-only -verify %s | 
 |  | 
 | // <rdar://problem/7971948> | 
 | struct A {}; | 
 | struct B { | 
 |   void foo(int b) { | 
 |     switch (a) { // expected-error{{use of undeclared identifier 'a'}} | 
 |     default: | 
 |       return; | 
 |     } | 
 |      | 
 |     switch (b) { | 
 |     case 17 // expected-error{{expected ':' after 'case'}} | 
 |       break; | 
 |  | 
 |     default // expected-error{{expected ':' after 'default'}} | 
 |       return; | 
 |     } | 
 |   } | 
 |  | 
 |   void test2() { | 
 |     enum X { Xa, Xb } x; | 
 |  | 
 |     switch (x) { // expected-warning {{enumeration value 'Xb' not handled in switch}} | 
 |     case Xa; // expected-error {{expected ':' after 'case'}} | 
 |       break; | 
 |     } | 
 |  | 
 |     switch (x) { | 
 |     default; // expected-error {{expected ':' after 'default'}} | 
 |       break; | 
 |     } | 
 |   } | 
 |  | 
 |   int test3(int i) { | 
 |     switch (i) { | 
 |       case 1: return 0; | 
 |       2: return 1;  // expected-error {{expected 'case' keyword before expression}} | 
 |       default: return 5; | 
 |     } | 
 |   } | 
 | }; | 
 |  | 
 | int test4(int i) { | 
 |   switch (i) | 
 |     1: return -1;  // expected-error {{expected 'case' keyword before expression}} | 
 |   return 0; | 
 | } | 
 |  | 
 | int test5(int i) { | 
 |   switch (i) { | 
 |     case 1: case 2: case 3: return 1; | 
 |     { | 
 |     4:5:6:7: return 2;  // expected-error 4{{expected 'case' keyword before expression}} | 
 |     } | 
 |     default: return -1; | 
 |   } | 
 | } | 
 |  | 
 | int test6(int i) { | 
 |   switch (i) { | 
 |     case 1: | 
 |     case 4: | 
 |       // This class provides extra single colon tokens.  Make sure no | 
 |       // errors are seen here. | 
 |       class foo{ | 
 |         public: | 
 |         protected: | 
 |         private: | 
 |       }; | 
 |     case 2: | 
 |     5:  // expected-error {{expected 'case' keyword before expression}} | 
 |     default: return 1; | 
 |   } | 
 | } | 
 |  | 
 | int test7(int i) { | 
 |   switch (i) { | 
 |     case false ? 1 : 2: | 
 |     true ? 1 : 2:  // expected-error {{expected 'case' keyword before expression}} | 
 |     case 10: | 
 |       14 ? 3 : 4;  // expected-warning {{expression result unused}} | 
 |     default: | 
 |       return 1; | 
 |   } | 
 | } | 
 |  | 
 | enum foo { A, B, C}; | 
 | int test8( foo x ) { | 
 |   switch (x) { | 
 |     A: return 0;  // FIXME: give a warning for unused labels that could also be | 
 |                   // a case expression. | 
 |     default: return 1; | 
 |   } | 
 | } | 
 |  | 
 | // Stress test to make sure Clang doesn't crash. | 
 | void test9(int x) { | 
 |   switch(x) { | 
 |     case 1: return; | 
 |     2: case; // expected-error {{expected 'case' keyword before expression}} \ | 
 |                 expected-error {{expected expression}} | 
 |     4:5:6: return; // expected-error 3{{expected 'case' keyword before expression}} | 
 |     7: :x; // expected-error {{expected 'case' keyword before expression}} \ | 
 |               expected-error {{expected expression}} | 
 |     8:: x; // expected-error {{expected ';' after expression}} \ | 
 |               expected-error {{no member named 'x' in the global namespace}} \ | 
 |               expected-warning {{expression result unused}} | 
 |     9:: :y; // expected-error {{expected ';' after expression}} \ | 
 |                expected-error {{expected unqualified-id}} \ | 
 |                expected-warning {{expression result unused}} | 
 |     :; // expected-error {{expected expression}} | 
 |     ::; // expected-error {{expected unqualified-id}} | 
 |   } | 
 | } | 
 |  | 
 | void test10(int x) { | 
 |   switch (x) { | 
 |     case 1: { | 
 |       struct Inner { | 
 |         void g(int y) { | 
 |           2: y++;  // expected-error {{expected ';' after expression}} \ | 
 |                    // expected-warning {{expression result unused}} | 
 |         } | 
 |       }; | 
 |       break; | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | template<typename T> | 
 | struct test11 { | 
 |   enum { E }; | 
 |  | 
 |   void f(int x) { | 
 |     switch (x) { | 
 |       E: break;    // FIXME: give a 'case' fix-it for unused labels that | 
 |                    // could also be an expression an a case label. | 
 |       E+1: break;  // expected-error {{expected 'case' keyword before expression}} | 
 |     } | 
 |   } | 
 | }; | 
 |  | 
 | void test12(int x) { | 
 |   switch (x) { | 
 |     0:  // expected-error {{expected 'case' keyword before expression}} | 
 |     while (x) { | 
 |       1:  // expected-error {{expected 'case' keyword before expression}} | 
 |       for (;x;) { | 
 |         2:  // expected-error {{expected 'case' keyword before expression}} | 
 |         if (x > 0) { | 
 |           3:  // expected-error {{expected 'case' keyword before expression}} | 
 |           --x; | 
 |         } | 
 |       } | 
 |     } | 
 |   } | 
 | } | 
 |  | 
 | void missing_statement_case(int x) { | 
 |   switch (x) { | 
 |     case 1: | 
 |     case 0: // expected-error {{label at end of compound statement: expected statement}} | 
 |   } | 
 | } | 
 |  | 
 | void missing_statement_default(int x) { | 
 |   switch (x) { | 
 |     case 0: | 
 |     default: // expected-error {{label at end of compound statement: expected statement}} | 
 |   } | 
 | } |