| // 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; | 
 |   } | 
 | } |