forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			234 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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) { // expected-note {{'x' declared here}}
 | |
|   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; did you mean simply 'x'?}} \
 | |
|               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}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| void pr19022_1() {
 | |
|   switch (int x)  // expected-error {{variable declaration in condition must have an initializer}}
 | |
|   case v: ;  // expected-error {{use of undeclared identifier 'v'}}
 | |
| }
 | |
| 
 | |
| void pr19022_1a(int x) {
 | |
|   switch(x) {
 | |
|   case 1  // expected-error{{expected ':' after 'case'}} \
 | |
|           // expected-error{{label at end of compound statement: expected statement}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| void pr19022_1b(int x) {
 | |
|   switch(x) {
 | |
|   case v  // expected-error{{use of undeclared identifier 'v'}} \
 | |
|           // expected-error{{expected ':' after 'case'}}
 | |
|   } // expected-error{{expected statement}}
 | |
|  }
 | |
| 
 | |
| void pr19022_2() {
 | |
|   switch (int x)  // expected-error {{variable declaration in condition must have an initializer}}
 | |
|   case v1: case v2: ;  // expected-error {{use of undeclared identifier 'v1'}} \
 | |
|                        // expected-error {{use of undeclared identifier 'v2'}}
 | |
| }
 | |
| 
 | |
| void pr19022_3(int x) {
 | |
|   switch (x)
 | |
|   case 1: case v2: ;  // expected-error {{use of undeclared identifier 'v2'}}
 | |
| }
 | |
| 
 | |
| int pr19022_4(int x) {
 | |
|   switch(x) {
 | |
|   case 1  // expected-error{{expected ':' after 'case'}} expected-note{{previous case defined here}}
 | |
|   case 1 : return x;  // expected-error{{duplicate case value '1'}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| void pr19022_5(int x) {
 | |
|   switch(x) {
 | |
|   case 1: case // expected-error{{expected ':' after 'case'}} \
 | |
|                // expected-error{{expected statement}}
 | |
|   }  // expected-error{{expected expression}}
 | |
| }
 | |
| 
 | |
| namespace pr19022 {
 | |
| int baz5() {}
 | |
| bool bar0() {
 | |
|   switch (int foo0)  //expected-error{{variable declaration in condition must have an initializer}}
 | |
|   case bar5: ;  // expected-error{{use of undeclared identifier 'bar5'}}
 | |
| }
 | |
| }
 | |
| 
 | |
| namespace pr21841 {
 | |
| void fn1() {
 | |
|   switch (0)
 | |
|     switch (0  // expected-note{{to match this '('}}
 | |
|     {  // expected-error{{expected ')'}}
 | |
|     }
 | |
| } // expected-error{{expected statement}}
 | |
| }
 |