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