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