197 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
// 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;
 | 
						|
  };
 | 
						|
}
 | 
						|
 |