|  | // RUN: %clang_cc1 -fsyntax-only -verify -Wall -fblocks %s | 
|  |  | 
|  | // PR9463 | 
|  | double *end; | 
|  | void f(bool b1, bool b2) { | 
|  | { | 
|  | do { | 
|  | int end = 0; | 
|  | if (b2) { | 
|  | do { | 
|  | goto end; | 
|  | } while (b2); | 
|  | } | 
|  | end = 1; | 
|  | } while (b1); | 
|  | } | 
|  |  | 
|  | end: | 
|  | return; | 
|  | } | 
|  |  | 
|  | namespace N { | 
|  | float* end; | 
|  | void f(bool b1, bool b2) { | 
|  | { | 
|  | do { | 
|  | int end = 0; | 
|  | if (b2) { | 
|  | do { | 
|  | goto end; | 
|  | } while (b2); | 
|  | } | 
|  | end = 1; | 
|  | } while (b1); | 
|  | } | 
|  |  | 
|  | end: | 
|  | return; | 
|  | } | 
|  | } | 
|  |  | 
|  | void g() { | 
|  | end = 1; // expected-error{{assigning to 'double *' from incompatible type 'int'}} | 
|  | } | 
|  |  | 
|  | void h(int end) { | 
|  | { | 
|  | goto end; // expected-error{{use of undeclared label 'end'}} | 
|  | } | 
|  | } | 
|  |  | 
|  | void h2(int end) { | 
|  | { | 
|  | __label__ end; | 
|  | goto end; | 
|  |  | 
|  | end: | 
|  | ::end = 0; | 
|  | } | 
|  | end: // expected-warning{{unused label 'end'}} | 
|  | end = 1; | 
|  | } | 
|  |  | 
|  | class X { | 
|  | public: | 
|  | X(); | 
|  | }; | 
|  |  | 
|  | void rdar9135994() | 
|  | { | 
|  | X: | 
|  | goto X; | 
|  | } | 
|  |  | 
|  | namespace PR9495 { | 
|  | struct NonPOD { NonPOD(); ~NonPOD(); }; | 
|  |  | 
|  | void f(bool b) { | 
|  | NonPOD np; | 
|  | if (b) { | 
|  | goto undeclared; // expected-error{{use of undeclared label 'undeclared'}} | 
|  | } | 
|  | } | 
|  |  | 
|  | void g() { | 
|  | (void)^(bool b){ | 
|  | NonPOD np; | 
|  | if (b) { | 
|  | goto undeclared; // expected-error{{use of undeclared label 'undeclared'}} | 
|  | } | 
|  | }; | 
|  | } | 
|  | } | 
|  |  | 
|  | extern "C" { | 
|  | void exit(int); | 
|  | } | 
|  |  | 
|  | void f() { | 
|  | { | 
|  | goto exit; | 
|  | } | 
|  | exit: | 
|  | return; | 
|  | } | 
|  |  | 
|  | namespace PR10620 { | 
|  | struct S { | 
|  | ~S() {} | 
|  | }; | 
|  | void g(const S& s) { | 
|  | goto done; // expected-error {{cannot jump}} | 
|  | const S s2(s); // expected-note {{jump bypasses variable initialization}} | 
|  | done: | 
|  | ; | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test12 { | 
|  | struct A { A(); A(const A&); ~A(); }; | 
|  | void test(A a) { // expected-note {{jump enters lifetime of block}} FIXME: weird location | 
|  | goto lbl; // expected-error {{cannot jump}} | 
|  | (void) ^{ (void) a; }; | 
|  | lbl: | 
|  | return; | 
|  | } | 
|  | } |