Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks
      2 
      3 void 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 
     16 void 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 
     26 void 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 
     35 void 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 
     51 void 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     __block int c;
     69     int d;
     70     ^{
     71       a = b; // expected-error{{__block variable 'a' cannot be captured in a captured statement}}
     72       b = d; // OK - Consistent with block inside a lambda
     73       c = a; // expected-error{{__block variable 'a' cannot be captured in a captured statement}}
     74       c = d; // OK
     75       d = b; // expected-error{{variable is not assignable (missing __block type specifier)}}
     76     }();
     77   }
     78 }
     79