1 // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks 2 test_gotos()3void test_gotos() { 4 goto L1; // expected-error {{use of undeclared label 'L1'}} 5 goto L3; // OK 6 #pragma clang __debug captured 7 { 8 L1: 9 goto L2; // OK 10 L2: 11 goto L3; // expected-error {{use of undeclared label 'L3'}} 12 } 13 L3: ; 14 } 15 test_break_continue()16void test_break_continue() { 17 while (1) { 18 #pragma clang __debug captured 19 { 20 break; // expected-error {{'break' statement not in loop or switch statement}} 21 continue; // expected-error {{'continue' statement not in loop statement}} 22 } 23 } 24 } 25 test_return()26void test_return() { 27 while (1) { 28 #pragma clang __debug captured 29 { 30 return; // expected-error {{cannot return from default captured statement}} 31 } 32 } 33 } 34 test_nest()35void test_nest() { 36 int x; 37 #pragma clang __debug captured 38 { 39 int y; 40 #pragma clang __debug captured 41 { 42 int z; 43 #pragma clang __debug captured 44 { 45 x = z = y; // OK 46 } 47 } 48 } 49 } 50 test_nest_block()51void test_nest_block() { 52 __block int x; // expected-note {{'x' declared here}} 53 int y; 54 ^{ 55 int z; 56 #pragma clang __debug captured 57 { 58 x = y; // expected-error{{__block variable 'x' cannot be captured in a captured statement}} 59 y = z; // expected-error{{variable is not assignable (missing __block type specifier)}} 60 z = y; // OK 61 } 62 }(); 63 64 __block int a; // expected-note 2 {{'a' declared here}} 65 int b; 66 #pragma clang __debug captured 67 { 68 int d; 69 ^{ 70 a = b; // expected-error{{__block variable 'a' cannot be captured in a captured statement}} 71 a = b; // (duplicate diagnostic suppressed) 72 b = d; // OK - Consistent with block inside a lambda 73 }(); 74 } 75 #pragma clang __debug captured 76 { 77 __block int c; 78 int d; 79 ^{ 80 c = a; // expected-error{{__block variable 'a' cannot be captured in a captured statement}} 81 c = d; // OK 82 d = b; // expected-error{{variable is not assignable (missing __block type specifier)}} 83 }(); 84 } 85 } 86