1// RUN: %clang_cc1 -fsyntax-only -verify -fobjc-exceptions -Wno-objc-root-class %s
2
3@class A, B, C;
4
5void test1() {
6  goto L; // expected-error{{goto into protected scope}}
7  goto L2; // expected-error{{goto into protected scope}}
8  goto L3; // expected-error{{goto into protected scope}}
9  @try {   // expected-note {{jump bypasses initialization of @try block}}
10L: ;
11  } @catch (A *x) { // expected-note {{jump bypasses initialization of @catch block}}
12L2: ;
13  } @catch (B *x) {
14  } @catch (C *c) {
15  } @finally {// expected-note {{jump bypasses initialization of @finally block}}
16L3: ;
17  }
18
19  @try {
20    goto L4; // expected-error{{goto into protected scope}}
21    goto L5; // expected-error{{goto into protected scope}}
22  } @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}}
23  L5: ;
24    goto L6; // expected-error{{goto into protected scope}}
25  } @catch (B *c) { // expected-note {{jump bypasses initialization of @catch block}}
26  L6: ;
27  } @finally { // expected-note {{jump bypasses initialization of @finally block}}
28  L4: ;
29  }
30
31
32  @try { // expected-note 2 {{jump bypasses initialization of @try block}}
33  L7: ;
34  } @catch (C *c) {
35    goto L7; // expected-error{{goto into protected scope}}
36  } @finally {
37    goto L7; // expected-error{{goto into protected scope}}
38  }
39
40  goto L8;  // expected-error{{goto into protected scope}}
41  @try {
42  } @catch (A *c) {
43  } @catch (B *c) {
44  } @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}}
45  L8: ;
46  }
47
48  // rdar://6810106
49  id X;
50  goto L9;    // expected-error{{goto into protected scope}}
51  goto L10;   // ok
52  @synchronized    // expected-note {{jump bypasses initialization of @synchronized block}}
53  ( ({ L10: ; X; })) {
54  L9:
55    ;
56  }
57}
58
59void test2(int a) {
60  if (a) goto L0;
61  @try {} @finally {}
62 L0:
63  return;
64}
65
66// rdar://6803963
67void test3() {
68  @try {
69    goto blargh;
70  blargh: ;
71  } @catch (...) {}
72}
73
74@interface Greeter
75+ (void) hello;
76@end
77
78@implementation Greeter
79+ (void) hello {
80
81  @try {
82    goto blargh;     // expected-error {{goto into protected scope}}
83  } @catch (...) {   // expected-note {{jump bypasses initialization of @catch block}}
84  blargh: ;
85  }
86}
87
88+ (void)meth2 {
89    int n; void *P;
90    goto L0;     // expected-error {{goto into protected scope}}
91    typedef int A[n];  // expected-note {{jump bypasses initialization of VLA typedef}}
92  L0:
93
94    goto L1;      // expected-error {{goto into protected scope}}
95    A b, c[10];        // expected-note 2 {{jump bypasses initialization of variable length array}}
96  L1:
97    goto L2;     // expected-error {{goto into protected scope}}
98    A d[n];      // expected-note {{jump bypasses initialization of variable length array}}
99  L2:
100    return;
101}
102
103@end
104