1 | // RUN: %clang_cc1 -fsyntax-only -verify -Wall -fblocks %s |
2 | |
3 | // PR9463 |
4 | double *end; |
5 | void f(bool b1, bool b2) { |
6 | { |
7 | do { |
8 | int end = 0; |
9 | if (b2) { |
10 | do { |
11 | goto end; |
12 | } while (b2); |
13 | } |
14 | end = 1; |
15 | } while (b1); |
16 | } |
17 | |
18 | end: |
19 | return; |
20 | } |
21 | |
22 | namespace N { |
23 | float* end; |
24 | void f(bool b1, bool b2) { |
25 | { |
26 | do { |
27 | int end = 0; |
28 | if (b2) { |
29 | do { |
30 | goto end; |
31 | } while (b2); |
32 | } |
33 | end = 1; |
34 | } while (b1); |
35 | } |
36 | |
37 | end: |
38 | return; |
39 | } |
40 | } |
41 | |
42 | void g() { |
43 | end = 1; // expected-error{{assigning to 'double *' from incompatible type 'int'}} |
44 | } |
45 | |
46 | void h(int end) { |
47 | { |
48 | goto end; // expected-error{{use of undeclared label 'end'}} |
49 | } |
50 | } |
51 | |
52 | void h2(int end) { |
53 | { |
54 | __label__ end; |
55 | goto end; |
56 | |
57 | end: |
58 | ::end = 0; |
59 | } |
60 | end: // expected-warning{{unused label 'end'}} |
61 | end = 1; |
62 | } |
63 | |
64 | class X { |
65 | public: |
66 | X(); |
67 | }; |
68 | |
69 | void rdar9135994() |
70 | { |
71 | X: |
72 | goto X; |
73 | } |
74 | |
75 | namespace PR9495 { |
76 | struct NonPOD { NonPOD(); ~NonPOD(); }; |
77 | |
78 | void f(bool b) { |
79 | NonPOD np; |
80 | if (b) { |
81 | goto undeclared; // expected-error{{use of undeclared label 'undeclared'}} |
82 | } |
83 | } |
84 | |
85 | void g() { |
86 | (void)^(bool b){ |
87 | NonPOD np; |
88 | if (b) { |
89 | goto undeclared; // expected-error{{use of undeclared label 'undeclared'}} |
90 | } |
91 | }; |
92 | } |
93 | } |
94 | |
95 | extern "C" { |
96 | void exit(int); |
97 | } |
98 | |
99 | void f() { |
100 | { |
101 | goto exit; |
102 | } |
103 | exit: |
104 | return; |
105 | } |
106 | |
107 | namespace PR10620 { |
108 | struct S { |
109 | ~S() {} |
110 | }; |
111 | void g(const S& s) { |
112 | goto done; // expected-error {{cannot jump}} |
113 | const S s2(s); // expected-note {{jump bypasses variable initialization}} |
114 | done: |
115 | ; |
116 | } |
117 | } |
118 | |
119 | namespace test12 { |
120 | struct A { A(); A(const A&); ~A(); }; |
121 | void test(A a) { // expected-note {{jump enters lifetime of block}} FIXME: weird location |
122 | goto lbl; // expected-error {{cannot jump}} |
123 | (void) ^{ (void) a; }; |
124 | lbl: |
125 | return; |
126 | } |
127 | } |
128 | |