128 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify -Wall -fblocks %s
 | |
| 
 | |
| // PR9463
 | |
| double *end;
 | |
| void f(bool b1, bool b2) {
 | |
|   {
 | |
|     do {
 | |
|       int end = 0;
 | |
|       if (b2) {
 | |
|         do {
 | |
|           goto end;
 | |
|         } while (b2);
 | |
|       }
 | |
|       end = 1;
 | |
|     } while (b1);
 | |
|   }
 | |
| 
 | |
|  end:
 | |
|   return;
 | |
| }
 | |
| 
 | |
| namespace N {
 | |
|   float* end;
 | |
|   void f(bool b1, bool b2) {
 | |
|     {
 | |
|       do {
 | |
|         int end = 0;
 | |
|         if (b2) {
 | |
|           do {
 | |
|             goto end;
 | |
|           } while (b2);
 | |
|         }
 | |
|         end = 1;
 | |
|       } while (b1);
 | |
|     }
 | |
| 
 | |
|   end:
 | |
|     return;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void g() {
 | |
|   end = 1; // expected-error{{assigning to 'double *' from incompatible type 'int'}}
 | |
| }
 | |
| 
 | |
| void h(int end) {
 | |
|   {
 | |
|     goto end; // expected-error{{use of undeclared label 'end'}}
 | |
|   }
 | |
| }
 | |
| 
 | |
| void h2(int end) {
 | |
|   {
 | |
|     __label__ end;
 | |
|     goto end;
 | |
| 
 | |
|   end:
 | |
|     ::end = 0;
 | |
|   }
 | |
|  end: // expected-warning{{unused label 'end'}}
 | |
|   end = 1;
 | |
| }
 | |
| 
 | |
| class X {
 | |
| public:
 | |
|   X();
 | |
| };
 | |
| 
 | |
| void rdar9135994()
 | |
| {
 | |
| X:  
 | |
|     goto X;
 | |
| }
 | |
| 
 | |
| namespace PR9495 {
 | |
|   struct NonPOD { NonPOD(); ~NonPOD(); };  
 | |
|   
 | |
|   void f(bool b) {
 | |
|     NonPOD np;
 | |
|     if (b) {
 | |
|       goto undeclared; // expected-error{{use of undeclared label 'undeclared'}}
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void g() {
 | |
|     (void)^(bool b){
 | |
|       NonPOD np;
 | |
|       if (b) {
 | |
|         goto undeclared; // expected-error{{use of undeclared label 'undeclared'}}
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| }
 | |
| 
 | |
| extern "C" {
 | |
|   void exit(int);
 | |
| }
 | |
| 
 | |
| void f() {
 | |
|   {
 | |
|     goto exit;
 | |
|   }
 | |
|  exit:
 | |
|   return;
 | |
| }
 | |
| 
 | |
| namespace PR10620 {
 | |
|   struct S {
 | |
|     ~S() {}
 | |
|   };
 | |
|   void g(const S& s) {
 | |
|     goto done; // expected-error {{cannot jump}}
 | |
|     const S s2(s); // expected-note {{jump bypasses variable initialization}}
 | |
|   done:
 | |
|     ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| namespace test12 {
 | |
|   struct A { A(); A(const A&); ~A(); };
 | |
|   void test(A a) { // expected-note {{jump enters lifetime of block}} FIXME: weird location
 | |
|     goto lbl; // expected-error {{cannot jump}}
 | |
|     (void) ^{ (void) a; };
 | |
|   lbl:
 | |
|     return;
 | |
|   }
 | |
| }
 |