// RUN: clang-cc -fsyntax-only -verify -fblocks -std=gnu99 %s int test1(int x) { goto L; // expected-error{{illegal goto into protected scope}} int a[x]; // expected-note {{jump bypasses initialization of variable length array}} int b[x]; // expected-note {{jump bypasses initialization of variable length array}} L: return sizeof a; } int test2(int x) { goto L; // expected-error{{illegal goto into protected scope}} typedef int a[x]; // expected-note {{jump bypasses initialization of VLA typedef}} L: return sizeof(a); } void test3clean(int*); int test3() { goto L; // expected-error{{illegal goto into protected scope}} int a __attribute((cleanup(test3clean))); // expected-note {{jump bypasses initialization of declaration with __attribute__((cleanup))}} L: return a; } int test4(int x) { goto L; // expected-error{{illegal goto into protected scope}} int a[x]; // expected-note {{jump bypasses initialization of variable length array}} test4(x); L: return sizeof a; } int test5(int x) { int a[x]; test5(x); goto L; // Ok. L: goto L; // Ok. return sizeof a; } int test6() { // just plain invalid. goto x; // expected-error {{use of undeclared label 'x'}} } void test7(int x) { switch (x) { case 1: ; int a[x]; // expected-note {{jump bypasses initialization of variable length array}} case 2: // expected-error {{illegal switch case into protected scope}} a[1] = 2; break; } } int test8(int x) { // For statement. goto L2; // expected-error {{illegal goto into protected scope}} for (int arr[x]; // expected-note {{jump bypasses initialization of variable length array}} ; ++x) L2:; // Statement expressions. goto L3; // expected-error {{illegal goto into protected scope}} int Y = ({ int a[x]; // expected-note {{jump bypasses initialization of variable length array}} L3: 4; }); goto L4; // expected-error {{illegal goto into protected scope}} { int A[x], // expected-note {{jump bypasses initialization of variable length array}} B[x]; // expected-note {{jump bypasses initialization of variable length array}} L4: ; } { L5: ;// ok int A[x], B = ({ if (x) goto L5; else goto L6; 4; }); L6:; // ok. if (x) goto L6; // ok } { L7: ;// ok int A[x], B = ({ if (x) goto L7; else goto L8; // expected-error {{illegal goto into protected scope}} 4; }), C[x]; // expected-note {{jump bypasses initialization of variable length array}} L8:; // bad } { L9: ;// ok int A[({ if (x) goto L9; else // FIXME: goto L10; // fixme-error {{illegal goto into protected scope}} 4; })]; L10:; // bad } { // FIXME: Crashes goto checker. //goto L11;// ok //int A[({ L11: 4; })]; } { goto L12; int y = 4; // fixme-warn: skips initializer. L12: ; } // Statement expressions 2. goto L1; // expected-error {{illegal goto into protected scope}} return x == ({ int a[x]; // expected-note {{jump bypasses initialization of variable length array}} L1: 42; }); } void test9(int n, void *P) { int Y; int Z = 4; goto *P; // ok. L2: ; int a[n]; // expected-note 2 {{jump bypasses initialization of variable length array}} L3: L4: goto *P; // expected-error {{illegal indirect goto in protected scope, unknown effect on scopes}} goto L3; // ok goto L4; // ok void *Ptrs[] = { &&L2, // Ok. &&L3 // expected-error {{address taken of label in protected scope, jump to it would have unknown effect on scope}} }; } void test10(int n, void *P) { goto L0; // expected-error {{illegal goto into protected scope}} typedef int A[n]; // expected-note {{jump bypasses initialization of VLA typedef}} L0: goto L1; // expected-error {{illegal goto into protected scope}} A b, c[10]; // expected-note 2 {{jump bypasses initialization of variable length array}} L1: goto L2; // expected-error {{illegal goto into protected scope}} A d[n]; // expected-note {{jump bypasses initialization of variable length array}} L2: return; } void test11(int n) { void *P = ^{ switch (n) { case 1:; case 2: case 3:; int Arr[n]; // expected-note {{jump bypasses initialization of variable length array}} case 4: // expected-error {{illegal switch case into protected scope}} return; } }; } // TODO: When and if gotos are allowed in blocks, this should work. void test12(int n) { void *P = ^{ goto L1; // expected-error {{goto not allowed in block literal}} L1: goto L2; // expected-error {{goto not allowed in block literal}} L2: goto L3; // expected-error {{goto not allowed in block literal}} // todo-error {{illegal goto into protected scope}} int Arr[n]; // todo-note {{jump bypasses initialization of variable length array}} L3: goto L4; // expected-error {{goto not allowed in block literal}} L4: return; }; }