captured-statements.c revision 524387ae3dfc0c4cf2b095f83f9e47aa549b7e55
16afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj// RUN: %clang_cc1 -fsyntax-only -verify %s -fblocks 26afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj 36afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Sirajvoid test_gotos() { 46afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj goto L1; // expected-error {{use of undeclared label 'L1'}} 56afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj goto L3; // OK 66afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 76afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 86afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. SirajL1: 96afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj goto L2; // OK 106afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. SirajL2: 116afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj goto L3; // expected-error {{use of undeclared label 'L3'}} 126afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 136afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. SirajL3: ; 146afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj} 156afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj 166afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Sirajvoid test_break_continue() { 176afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj while (1) { 186afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 196afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 206afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj break; // expected-error {{'break' statement not in loop or switch statement}} 216afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj continue; // expected-error {{'continue' statement not in loop statement}} 226afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 236afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 246afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj} 256afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj 266afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Sirajvoid test_return() { 276afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj while (1) { 286afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 296afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 306afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj return; // expected-error {{cannot return from default captured statement}} 316afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 326afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 336afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj} 346afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj 356afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Sirajvoid test_nest() { 366afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj int x; 376afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 386afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 396afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj int y; 406afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 416afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 426afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj int z; 436afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 446afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 456afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj x = z = y; // OK 466afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 476afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 486afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 496afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj} 506afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj 516afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Sirajvoid test_nest_block() { 52524387ae3dfc0c4cf2b095f83f9e47aa549b7e55Ben Langmuir __block int x; // expected-note {{'x' declared here}} 536afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj int y; 546afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj ^{ 556afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj int z; 566afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 576afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 58524387ae3dfc0c4cf2b095f83f9e47aa549b7e55Ben Langmuir x = y; // expected-error{{__block variable 'x' cannot be captured in a captured statement}} 596afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj y = z; // expected-error{{variable is not assignable (missing __block type specifier)}} 606afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj z = y; // OK 616afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 626afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj }(); 636afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj 64524387ae3dfc0c4cf2b095f83f9e47aa549b7e55Ben Langmuir __block int a; // expected-note 2 {{'a' declared here}} 656afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj int b; 666afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj #pragma clang __debug captured 676afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj { 686afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj __block int c; 696afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj int d; 706afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj ^{ 71524387ae3dfc0c4cf2b095f83f9e47aa549b7e55Ben Langmuir a = b; // expected-error{{__block variable 'a' cannot be captured in a captured statement}} 726afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj b = d; // OK - Consistent with block inside a lambda 73524387ae3dfc0c4cf2b095f83f9e47aa549b7e55Ben Langmuir c = a; // expected-error{{__block variable 'a' cannot be captured in a captured statement}} 74524387ae3dfc0c4cf2b095f83f9e47aa549b7e55Ben Langmuir c = d; // OK 756afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj d = b; // expected-error{{variable is not assignable (missing __block type specifier)}} 766afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj }(); 776afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj } 786afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj} 79