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