| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- // RUN: %clang_cc1 -fsyntax-only -verify -fblocks -std=gnu99 %s -Wno-unreachable-code
- int test1(int x) {
- goto L; // expected-error{{cannot jump from this goto statement to its label}}
- 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{{cannot jump from this goto statement to its label}}
- 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{{cannot jump from this goto statement to its label}}
- int a __attribute((cleanup(test3clean))); // expected-note {{jump bypasses initialization of variable with __attribute__((cleanup))}}
- L:
- return a;
- }
- int test4(int x) {
- goto L; // expected-error{{cannot jump from this goto statement to its label}}
- 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 {{cannot jump from switch statement to this case label}}
- a[1] = 2;
- break;
- }
- }
- int test8(int x) {
- // For statement.
- goto L2; // expected-error {{cannot jump from this goto statement to its label}}
- for (int arr[x]; // expected-note {{jump bypasses initialization of variable length array}}
- ; ++x)
- L2:;
- // Statement expressions.
- goto L3; // expected-error {{cannot jump from this goto statement to its label}}
- int Y = ({ int a[x]; // expected-note {{jump bypasses initialization of variable length array}}
- L3: 4; });
-
- goto L4; // expected-error {{cannot jump from this goto statement to its label}}
- {
- 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 {{cannot jump from this goto statement to its label}}
- 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 {{cannot jump from this goto statement to its label}}
- 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 {{cannot jump from this goto statement to its label}}
- 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; // expected-error {{cannot jump from this indirect goto statement to one of its possible targets}}
- L2: ;
- int a[n]; // expected-note {{jump bypasses initialization of variable length array}}
- L3: // expected-note {{possible target of indirect goto}}
- L4:
- goto *P;
- goto L3; // ok
- goto L4; // ok
-
- void *Ptrs[] = {
- &&L2,
- &&L3
- };
- }
- void test10(int n, void *P) {
- goto L0; // expected-error {{cannot jump from this goto statement to its label}}
- typedef int A[n]; // expected-note {{jump bypasses initialization of VLA typedef}}
- L0:
-
- goto L1; // expected-error {{cannot jump from this goto statement to its label}}
- A b, c[10]; // expected-note 2 {{jump bypasses initialization of variable length array}}
- L1:
- goto L2; // expected-error {{cannot jump from this goto statement to its label}}
- 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 {{cannot jump from switch statement to this case label}}
- return;
- }
- };
- }
- // TODO: When and if gotos are allowed in blocks, this should work.
- void test12(int n) {
- void *P = ^{
- goto L1;
- L1:
- goto L2;
- L2:
- goto L3; // expected-error {{cannot jump from this goto statement to its label}}
- int Arr[n]; // expected-note {{jump bypasses initialization of variable length array}}
- L3:
- goto L4;
- L4: return;
- };
- }
- void test13(int n, void *p) {
- int vla[n];
- goto *p;
- a0: ;
- static void *ps[] = { &&a0 };
- }
- int test14(int n) {
- static void *ps[] = { &&a0, &&a1 };
- if (n < 0)
- goto *&&a0;
- if (n > 0) {
- int vla[n];
- a1:
- vla[n-1] = 0;
- }
- a0:
- return 0;
- }
- // PR8473: IR gen can't deal with indirect gotos past VLA
- // initialization, so that really needs to be a hard error.
- void test15(int n, void *pc) {
- static const void *addrs[] = { &&L1, &&L2 };
- goto *pc; // expected-error {{cannot jump from this indirect goto statement to one of its possible targets}}
- L1:
- {
- char vla[n]; // expected-note {{jump bypasses initialization}}
- L2: // expected-note {{possible target}}
- vla[0] = 'a';
- }
- }
- // rdar://9024687
- int test16(int [sizeof &&z]); // expected-error {{use of address-of-label extension outside of a function body}}
|