104 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| // RUN: %clang_cc1 -fsyntax-only -verify -fobjc-exceptions -Wno-objc-root-class %s
 | |
| 
 | |
| @class A, B, C;
 | |
| 
 | |
| void test1() {
 | |
|   goto L; // expected-error{{cannot jump}}
 | |
|   goto L2; // expected-error{{cannot jump}}
 | |
|   goto L3; // expected-error{{cannot jump}}
 | |
|   @try {   // expected-note {{jump bypasses initialization of @try block}}
 | |
| L: ;
 | |
|   } @catch (A *x) { // expected-note {{jump bypasses initialization of @catch block}}
 | |
| L2: ;
 | |
|   } @catch (B *x) {
 | |
|   } @catch (C *c) {
 | |
|   } @finally {// expected-note {{jump bypasses initialization of @finally block}}
 | |
| L3: ;
 | |
|   }
 | |
|   
 | |
|   @try {
 | |
|     goto L4; // expected-error{{cannot jump}}
 | |
|     goto L5; // expected-error{{cannot jump}}
 | |
|   } @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}}
 | |
|   L5: ;
 | |
|     goto L6; // expected-error{{cannot jump}}
 | |
|   } @catch (B *c) { // expected-note {{jump bypasses initialization of @catch block}}
 | |
|   L6: ;
 | |
|   } @finally { // expected-note {{jump bypasses initialization of @finally block}}
 | |
|   L4: ;
 | |
|   }
 | |
|  
 | |
|   
 | |
|   @try { // expected-note 2 {{jump bypasses initialization of @try block}}
 | |
|   L7: ;
 | |
|   } @catch (C *c) {
 | |
|     goto L7; // expected-error{{cannot jump}}
 | |
|   } @finally {
 | |
|     goto L7; // expected-error{{cannot jump}}
 | |
|   }
 | |
|   
 | |
|   goto L8;  // expected-error{{cannot jump}}
 | |
|   @try { 
 | |
|   } @catch (A *c) {
 | |
|   } @catch (B *c) {
 | |
|   } @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}}
 | |
|   L8: ;
 | |
|   }
 | |
|   
 | |
|   // rdar://6810106
 | |
|   id X;
 | |
|   goto L9;    // expected-error{{cannot jump}}
 | |
|   goto L10;   // ok
 | |
|   @synchronized    // expected-note {{jump bypasses initialization of @synchronized block}}
 | |
|   ( ({ L10: ; X; })) {
 | |
|   L9:
 | |
|     ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void test2(int a) {
 | |
|   if (a) goto L0;
 | |
|   @try {} @finally {}
 | |
|  L0:
 | |
|   return;
 | |
| }
 | |
| 
 | |
| // rdar://6803963
 | |
| void test3() {
 | |
|   @try {
 | |
|     goto blargh;
 | |
|   blargh: ;
 | |
|   } @catch (...) {}
 | |
| }
 | |
| 
 | |
| @interface Greeter
 | |
| + (void) hello;
 | |
| @end
 | |
| 
 | |
| @implementation Greeter
 | |
| + (void) hello {
 | |
| 
 | |
|   @try {
 | |
|     goto blargh;     // expected-error {{cannot jump}}
 | |
|   } @catch (...) {   // expected-note {{jump bypasses initialization of @catch block}}
 | |
|   blargh: ;
 | |
|   }
 | |
| }
 | |
| 
 | |
| + (void)meth2 {
 | |
|     int n; void *P;
 | |
|     goto L0;     // expected-error {{cannot jump}}
 | |
|     typedef int A[n];  // expected-note {{jump bypasses initialization of VLA typedef}}
 | |
|   L0:
 | |
|     
 | |
|     goto L1;      // expected-error {{cannot jump}}
 | |
|     A b, c[10];        // expected-note 2 {{jump bypasses initialization of variable length array}}
 | |
|   L1:
 | |
|     goto L2;     // expected-error {{cannot jump}}
 | |
|     A d[n];      // expected-note {{jump bypasses initialization of variable length array}}
 | |
|   L2:
 | |
|     return;
 | |
| }
 | |
| 
 | |
| @end
 |