11d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify -Wall -fblocks %s
2c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor
37cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor// PR9463
47cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregordouble *end;
5bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregorvoid f(bool b1, bool b2) {
67cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  {
7bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor    do {
8bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor      int end = 0;
9bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor      if (b2) {
10bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor        do {
11bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor          goto end;
12bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor        } while (b2);
13bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor      }
14bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor      end = 1;
15bec7343433f6d4feee6af3a3a664f0301d41960eDouglas Gregor    } while (b1);
167cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  }
177cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
187cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor end:
197cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  return;
207cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor}
217cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
22fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregornamespace N {
23fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor  float* end;
24fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor  void f(bool b1, bool b2) {
25fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    {
26fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      do {
27fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor        int end = 0;
28fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor        if (b2) {
29fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor          do {
30fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor            goto end;
31fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor          } while (b2);
32fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor        }
33fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor        end = 1;
34fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      } while (b1);
35fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    }
36fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor
37fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor  end:
38fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    return;
39fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor  }
40fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor}
41fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor
427cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregorvoid g() {
437cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  end = 1; // expected-error{{assigning to 'double *' from incompatible type 'int'}}
447cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor}
45250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor
46250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregorvoid h(int end) {
47250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  {
48250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor    goto end; // expected-error{{use of undeclared label 'end'}}
49250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  }
50250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor}
51250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor
52250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregorvoid h2(int end) {
53250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  {
54250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor    __label__ end;
55250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor    goto end;
56250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor
57250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  end:
58250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor    ::end = 0;
59250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  }
601d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor end: // expected-warning{{unused label 'end'}}
61250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  end = 1;
62250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor}
63250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor
64250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregorclass X {
65250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregorpublic:
66250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  X();
67250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor};
68250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor
69250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregorvoid rdar9135994()
70250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor{
71250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas GregorX:
72250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor    goto X;
73250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor}
74c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor
75c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregornamespace PR9495 {
76c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor  struct NonPOD { NonPOD(); ~NonPOD(); };
77c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor
78c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor  void f(bool b) {
79c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor    NonPOD np;
80c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor    if (b) {
81c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor      goto undeclared; // expected-error{{use of undeclared label 'undeclared'}}
82c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor    }
83c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor  }
84c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor
85c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor  void g() {
86c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor    (void)^(bool b){
87c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor      NonPOD np;
88c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor      if (b) {
89c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor        goto undeclared; // expected-error{{use of undeclared label 'undeclared'}}
90c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor      }
91c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor    };
92c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor  }
93c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor}
94c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor
951d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregorextern "C" {
961d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor  void exit(int);
971d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor}
98c9977d09a2de7f7d2245973413d4caf86c736640Douglas Gregor
991d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregorvoid f() {
1001d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor  {
1011d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor    goto exit;
1021d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor  }
1031d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor exit:
1041d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor  return;
1051d2de76c75fc1ac870c6df84c5368206c00d9a5eDouglas Gregor}
1067badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman
1077badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedmannamespace PR10620 {
1087badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman  struct S {
1097badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman    ~S() {}
1107badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman  };
1117badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman  void g(const S& s) {
1127badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman    goto done; // expected-error {{goto into protected scope}}
1137badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman    const S s2(s); // expected-note {{jump bypasses variable initialization}}
1147badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman  done:
1157badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman    ;
1167badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman  }
1177badd2467a1650c0c2a5fdef974f590fc32c3694Eli Friedman}
11897b57a2170c2138fb71d336d77c6db7728938108John McCall
11997b57a2170c2138fb71d336d77c6db7728938108John McCallnamespace test12 {
12097b57a2170c2138fb71d336d77c6db7728938108John McCall  struct A { A(); A(const A&); ~A(); };
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void test(A a) { // expected-note {{jump enters lifetime of block}} FIXME: weird location
12297b57a2170c2138fb71d336d77c6db7728938108John McCall    goto lbl; // expected-error {{goto into protected scope}}
12397b57a2170c2138fb71d336d77c6db7728938108John McCall    (void) ^{ (void) a; };
12497b57a2170c2138fb71d336d77c6db7728938108John McCall  lbl:
12597b57a2170c2138fb71d336d77c6db7728938108John McCall    return;
12697b57a2170c2138fb71d336d77c6db7728938108John McCall  }
12797b57a2170c2138fb71d336d77c6db7728938108John McCall}
128