1 | // RUN: %clang_cc1 -triple x86_64-apple-macosx10.10 -fsyntax-only -verify -fobjc-exceptions -Wno-objc-root-class %s |
2 | |
3 | @class A, B, C; |
4 | |
5 | void test1() { |
6 | goto L; // expected-error{{cannot jump}} |
7 | goto L2; // expected-error{{cannot jump}} |
8 | goto L3; // expected-error{{cannot jump}} |
9 | @try { // expected-note {{jump bypasses initialization of @try block}} |
10 | L: ; |
11 | } @catch (A *x) { // expected-note {{jump bypasses initialization of @catch block}} |
12 | L2: ; |
13 | } @catch (B *x) { |
14 | } @catch (C *c) { |
15 | } @finally {// expected-note {{jump bypasses initialization of @finally block}} |
16 | L3: ; |
17 | } |
18 | |
19 | @try { |
20 | goto L4; // expected-error{{cannot jump}} |
21 | goto L5; // expected-error{{cannot jump}} |
22 | } @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}} |
23 | L5: ; |
24 | goto L6; // expected-error{{cannot jump}} |
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{{cannot jump}} |
36 | } @finally { |
37 | goto L7; // expected-error{{cannot jump}} |
38 | } |
39 | |
40 | goto L8; // expected-error{{cannot jump}} |
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{{cannot jump}} |
51 | goto L10; // ok |
52 | @synchronized // expected-note {{jump bypasses initialization of @synchronized block}} |
53 | ( ({ L10: ; X; })) { |
54 | L9: |
55 | ; |
56 | } |
57 | } |
58 | |
59 | void test2(int a) { |
60 | if (a) goto L0; |
61 | @try {} @finally {} |
62 | L0: |
63 | return; |
64 | } |
65 | |
66 | // rdar://6803963 |
67 | void 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 {{cannot jump}} |
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 {{cannot jump}} |
91 | typedef int A[n]; // expected-note {{jump bypasses initialization of VLA typedef}} |
92 | L0: |
93 | |
94 | goto L1; // expected-error {{cannot jump}} |
95 | A b, c[10]; // expected-note 2 {{jump bypasses initialization of variable length array}} |
96 | L1: |
97 | goto L2; // expected-error {{cannot jump}} |
98 | A d[n]; // expected-note {{jump bypasses initialization of variable length array}} |
99 | L2: |
100 | return; |
101 | } |
102 | |
103 | @end |
104 | |