| // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks |
| |
| void test_gotos() { |
| goto L1; // expected-error {{use of undeclared label 'L1'}} |
| goto L3; // OK |
| #pragma clang __debug captured |
| { |
| L1: |
| goto L2; // OK |
| L2: |
| goto L3; // expected-error {{use of undeclared label 'L3'}} |
| } |
| L3: ; |
| } |
| |
| void test_break_continue() { |
| while (1) { |
| #pragma clang __debug captured |
| { |
| break; // expected-error {{'break' statement not in loop or switch statement}} |
| continue; // expected-error {{'continue' statement not in loop statement}} |
| } |
| } |
| } |
| |
| void test_return() { |
| while (1) { |
| #pragma clang __debug captured |
| { |
| return; // expected-error {{cannot return from default captured statement}} |
| } |
| } |
| } |
| |
| void test_nest() { |
| int x; |
| #pragma clang __debug captured |
| { |
| int y; |
| #pragma clang __debug captured |
| { |
| int z; |
| #pragma clang __debug captured |
| { |
| x = z = y; // OK |
| } |
| } |
| } |
| } |
| |
| void test_nest_block() { |
| __block int x; // expected-note {{'x' declared here}} |
| int y; |
| ^{ |
| int z; |
| #pragma clang __debug captured |
| { |
| x = y; // expected-error{{__block variable 'x' cannot be captured in a captured statement}} |
| y = z; // expected-error{{variable is not assignable (missing __block type specifier)}} |
| z = y; // OK |
| } |
| }(); |
| |
| __block int a; // expected-note 2 {{'a' declared here}} |
| int b; |
| #pragma clang __debug captured |
| { |
| __block int c; |
| int d; |
| ^{ |
| a = b; // expected-error{{__block variable 'a' cannot be captured in a captured statement}} |
| b = d; // OK - Consistent with block inside a lambda |
| c = a; // expected-error{{__block variable 'a' cannot be captured in a captured statement}} |
| c = d; // OK |
| d = b; // expected-error{{variable is not assignable (missing __block type specifier)}} |
| }(); |
| } |
| } |