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