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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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