163 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
// RUN: %clang_cc1 %s -verify -fsyntax-only -ffreestanding
 | 
						|
 | 
						|
#include <stddef.h>
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
typedef void (* fp)(void);
 | 
						|
void foo(void);
 | 
						|
 | 
						|
// PR clang/3377
 | 
						|
fp a[(short int)1] = { foo };
 | 
						|
 | 
						|
int myArray[5] = {1, 2, 3, 4, 5};
 | 
						|
int *myPointer2 = myArray;
 | 
						|
int *myPointer = &(myArray[2]);
 | 
						|
 | 
						|
 | 
						|
extern int x;
 | 
						|
void *g = &x;
 | 
						|
int *h = &x;
 | 
						|
 | 
						|
struct union_crash
 | 
						|
{
 | 
						|
    union
 | 
						|
    {
 | 
						|
    };
 | 
						|
};
 | 
						|
 | 
						|
int test() {
 | 
						|
  int a[10];
 | 
						|
  int b[10] = a; // expected-error {{array initializer must be an initializer list}}
 | 
						|
  int +; // expected-error {{expected identifier or '('}}
 | 
						|
 | 
						|
  struct union_crash u = { .d = 1 }; // expected-error {{field designator 'd' does not refer to any field in type 'struct union_crash'}}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// PR2050
 | 
						|
struct cdiff_cmd {
 | 
						|
          const char *name;
 | 
						|
          unsigned short argc;
 | 
						|
          int (*handler)();
 | 
						|
};
 | 
						|
int cdiff_cmd_open();
 | 
						|
struct cdiff_cmd commands[] = {
 | 
						|
        {"OPEN", 1, &cdiff_cmd_open }
 | 
						|
};
 | 
						|
 | 
						|
// PR2348
 | 
						|
static struct { int z; } s[2];
 | 
						|
int *t = &(*s).z;
 | 
						|
 | 
						|
// PR2349
 | 
						|
short *a2(void)
 | 
						|
{
 | 
						|
  short int b;
 | 
						|
  static short *bp = &b; // expected-error {{initializer element is not a compile-time constant}}
 | 
						|
 | 
						|
  return bp;
 | 
						|
}
 | 
						|
 | 
						|
int pbool(void) {
 | 
						|
  typedef const _Bool cbool;
 | 
						|
  _Bool pbool1 = (void *) 0;
 | 
						|
  cbool pbool2 = &pbool;
 | 
						|
  return pbool2;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// rdar://5870981
 | 
						|
union { float f; unsigned u; } u = { 1.0f };
 | 
						|
 | 
						|
// rdar://6156694
 | 
						|
int f3(int x) { return x; }
 | 
						|
typedef void (*vfunc)(void);
 | 
						|
void *bar = (vfunc) f3;
 | 
						|
 | 
						|
// PR2747
 | 
						|
struct sym_reg {
 | 
						|
        char nc_gpreg;
 | 
						|
};
 | 
						|
int sym_fw1a_scr[] = {
 | 
						|
           ((int)(&((struct sym_reg *)0)->nc_gpreg)) & 0,
 | 
						|
           8 * ((int)(&((struct sym_reg *)0)->nc_gpreg))
 | 
						|
};
 | 
						|
 | 
						|
// PR3001
 | 
						|
struct s1 s2 = { // expected-error {{variable has incomplete type 'struct s1'}}  \
 | 
						|
                 // expected-note {{forward declaration of 'struct s1'}}
 | 
						|
    .a = sizeof(struct s3), // expected-error {{invalid application of 'sizeof'}} \
 | 
						|
                            // expected-note{{forward declaration of 'struct s3'}}
 | 
						|
    .b = bogus // expected-error {{use of undeclared identifier 'bogus'}}
 | 
						|
}
 | 
						|
 | 
						|
// PR3382
 | 
						|
char t[] = ("Hello");
 | 
						|
 | 
						|
// <rdar://problem/6094855>
 | 
						|
typedef struct { } empty;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  empty e;
 | 
						|
  int i2;
 | 
						|
} st;
 | 
						|
 | 
						|
st st1 = { .i2 = 1 };
 | 
						|
 | 
						|
// <rdar://problem/6096826>
 | 
						|
struct {
 | 
						|
  int a;
 | 
						|
  int z[2];
 | 
						|
} y = { .z = {} };
 | 
						|
 | 
						|
int bbb[10];
 | 
						|
 | 
						|
struct foo2 {
 | 
						|
   uintptr_t a;
 | 
						|
};
 | 
						|
 | 
						|
struct foo2 bar2[] = {
 | 
						|
   { (intptr_t)bbb }
 | 
						|
};
 | 
						|
 | 
						|
struct foo2 bar3 = { 1, 2 }; // expected-warning{{excess elements in struct initializer}}
 | 
						|
 | 
						|
int* ptest1 = __builtin_choose_expr(1, (int*)0, (int*)0);
 | 
						|
 | 
						|
typedef int32_t ivector4 __attribute((vector_size(16)));
 | 
						|
ivector4 vtest1 = 1 ? (ivector4){1} : (ivector4){1};
 | 
						|
ivector4 vtest2 = __builtin_choose_expr(1, (ivector4){1}, (ivector4){1});
 | 
						|
 | 
						|
uintptr_t ptrasintadd1 = (uintptr_t)&a - 4;
 | 
						|
uintptr_t ptrasintadd2 = (uintptr_t)&a + 4;
 | 
						|
uintptr_t ptrasintadd3 = 4 + (uintptr_t)&a;
 | 
						|
 | 
						|
// PR4285
 | 
						|
const wchar_t widestr[] = L"asdf";
 | 
						|
 | 
						|
// PR5447
 | 
						|
const double pr5447 = (0.05 < -1.0) ? -1.0 : 0.0499878;
 | 
						|
 | 
						|
// PR4386
 | 
						|
 | 
						|
// None of these are constant initializers, but we implement GCC's old
 | 
						|
// behaviour of accepting bar and zed but not foo. GCC's behaviour was
 | 
						|
// changed in 2007 (rev 122551), so we should be able to change too one
 | 
						|
// day.
 | 
						|
int PR4386_bar();
 | 
						|
int PR4386_foo() __attribute((weak));
 | 
						|
int PR4386_zed();
 | 
						|
 | 
						|
int PR4386_a = ((void *) PR4386_bar) != 0;
 | 
						|
int PR4386_b = ((void *) PR4386_foo) != 0; // expected-error{{initializer element is not a compile-time constant}}
 | 
						|
int PR4386_c = ((void *) PR4386_zed) != 0;
 | 
						|
int PR4386_zed() __attribute((weak));
 | 
						|
 | 
						|
// <rdar://problem/10185490> (derived from SPEC vortex benchmark)
 | 
						|
typedef char strty[10];
 | 
						|
struct vortexstruct { strty s; };
 | 
						|
struct vortexstruct vortexvar = { "asdf" };
 | 
						|
 | 
						|
typedef struct { uintptr_t x : 2; } StructWithBitfield;
 | 
						|
StructWithBitfield bitfieldvar = { (uintptr_t)&bitfieldvar }; // expected-error {{initializer element is not a compile-time constant}}
 |