1*67e74705SXin Li // RUN: %clang_cc1 %s -verify -fsyntax-only 2*67e74705SXin Li struct xx { int bitf:1; }; 3*67e74705SXin Li 4*67e74705SXin Li struct entry { struct xx *whatever; 5*67e74705SXin Li int value; 6*67e74705SXin Li int bitf:1; }; add_one(int * p)7*67e74705SXin Livoid add_one(int *p) { (*p)++; } 8*67e74705SXin Li test()9*67e74705SXin Livoid test() { 10*67e74705SXin Li register struct entry *p; 11*67e74705SXin Li add_one(&p->value); 12*67e74705SXin Li struct entry pvalue; 13*67e74705SXin Li add_one(&p->bitf); // expected-error {{address of bit-field requested}} 14*67e74705SXin Li add_one(&pvalue.bitf); // expected-error {{address of bit-field requested}} 15*67e74705SXin Li add_one(&p->whatever->bitf); // expected-error {{address of bit-field requested}} 16*67e74705SXin Li } 17*67e74705SXin Li foo()18*67e74705SXin Livoid foo() { 19*67e74705SXin Li register int x[10]; 20*67e74705SXin Li &x[10]; // expected-error {{address of register variable requested}} 21*67e74705SXin Li 22*67e74705SXin Li register int *y; 23*67e74705SXin Li 24*67e74705SXin Li int *x2 = &y; // expected-error {{address of register variable requested}} 25*67e74705SXin Li int *x3 = &y[10]; 26*67e74705SXin Li } 27*67e74705SXin Li testVectorComponentAccess()28*67e74705SXin Livoid testVectorComponentAccess() { 29*67e74705SXin Li typedef float v4sf __attribute__ ((vector_size (16))); 30*67e74705SXin Li static v4sf q; 31*67e74705SXin Li float* r = &q[0]; // expected-error {{address of vector element requested}} 32*67e74705SXin Li } 33*67e74705SXin Li 34*67e74705SXin Li typedef __attribute__(( ext_vector_type(4) )) float float4; 35*67e74705SXin Li testExtVectorComponentAccess(float4 x)36*67e74705SXin Lifloat *testExtVectorComponentAccess(float4 x) { 37*67e74705SXin Li return &x.w; // expected-error {{address of vector element requested}} 38*67e74705SXin Li } 39*67e74705SXin Li f0()40*67e74705SXin Livoid f0() { 41*67e74705SXin Li register int *x0; 42*67e74705SXin Li int *_dummy0 = &(*x0); 43*67e74705SXin Li 44*67e74705SXin Li register int *x1; 45*67e74705SXin Li int *_dummy1 = &(*(x1 + 1)); 46*67e74705SXin Li } 47*67e74705SXin Li 48*67e74705SXin Li // FIXME: The checks for this function are broken; we should error 49*67e74705SXin Li // on promoting a register array to a pointer! (C99 6.3.2.1p3) f1()50*67e74705SXin Livoid f1() { 51*67e74705SXin Li register int x0[10]; 52*67e74705SXin Li int *_dummy00 = x0; // fixme-error {{address of register variable requested}} 53*67e74705SXin Li int *_dummy01 = &(*x0); // fixme-error {{address of register variable requested}} 54*67e74705SXin Li 55*67e74705SXin Li register int x1[10]; 56*67e74705SXin Li int *_dummy1 = &(*(x1 + 1)); // fixme-error {{address of register variable requested}} 57*67e74705SXin Li 58*67e74705SXin Li register int *x2; 59*67e74705SXin Li int *_dummy2 = &(*(x2 + 1)); 60*67e74705SXin Li 61*67e74705SXin Li register int x3[10][10][10]; 62*67e74705SXin Li int (*_dummy3)[10] = &x3[0][0]; // expected-error {{address of register variable requested}} 63*67e74705SXin Li 64*67e74705SXin Li register struct { int f0[10]; } x4; 65*67e74705SXin Li int *_dummy4 = &x4.f0[2]; // expected-error {{address of register variable requested}} 66*67e74705SXin Li } 67*67e74705SXin Li f2()68*67e74705SXin Livoid f2() { 69*67e74705SXin Li register int *y; 70*67e74705SXin Li 71*67e74705SXin Li int *_dummy0 = &y; // expected-error {{address of register variable requested}} 72*67e74705SXin Li int *_dummy1 = &y[10]; 73*67e74705SXin Li } 74*67e74705SXin Li f3()75*67e74705SXin Livoid f3() { 76*67e74705SXin Li extern void f4(); 77*67e74705SXin Li void (*_dummy0)() = &****f4; 78*67e74705SXin Li } 79*67e74705SXin Li f4()80*67e74705SXin Livoid f4() { 81*67e74705SXin Li register _Complex int x; 82*67e74705SXin Li 83*67e74705SXin Li int *_dummy0 = &__real__ x; // expected-error {{address of register variable requested}} 84*67e74705SXin Li } 85*67e74705SXin Li f5()86*67e74705SXin Livoid f5() { 87*67e74705SXin Li register int arr[2]; 88*67e74705SXin Li 89*67e74705SXin Li /* This is just here because if we happened to support this as an 90*67e74705SXin Li lvalue we would need to give a warning. Note that gcc warns about 91*67e74705SXin Li this as a register before it warns about it as an invalid 92*67e74705SXin Li lvalue. */ 93*67e74705SXin Li int *_dummy0 = &(int*) arr; // expected-error {{cannot take the address of an rvalue}} 94*67e74705SXin Li int *_dummy1 = &(arr + 1); // expected-error {{cannot take the address of an rvalue}} 95*67e74705SXin Li } 96*67e74705SXin Li f6(register int x)97*67e74705SXin Livoid f6(register int x) { 98*67e74705SXin Li int * dummy0 = &x; // expected-error {{address of register variable requested}} 99*67e74705SXin Li } 100*67e74705SXin Li f7()101*67e74705SXin Lichar* f7() { 102*67e74705SXin Li register struct {char* x;} t1 = {"Hello"}; 103*67e74705SXin Li char* dummy1 = &(t1.x[0]); 104*67e74705SXin Li 105*67e74705SXin Li struct {int a : 10;} t2; 106*67e74705SXin Li int* dummy2 = &(t2.a); // expected-error {{address of bit-field requested}} 107*67e74705SXin Li 108*67e74705SXin Li void* t3 = &(*(void*)0); 109*67e74705SXin Li } 110*67e74705SXin Li f8()111*67e74705SXin Livoid f8() { 112*67e74705SXin Li void *dummy0 = &f8(); // expected-error {{cannot take the address of an rvalue of type 'void'}} 113*67e74705SXin Li 114*67e74705SXin Li extern void v; 115*67e74705SXin Li void *dummy1 = &(1 ? v : f8()); // expected-error {{cannot take the address of an rvalue of type 'void'}} 116*67e74705SXin Li 117*67e74705SXin Li void *dummy2 = &(f8(), v); // expected-error {{cannot take the address of an rvalue of type 'void'}} 118*67e74705SXin Li 119*67e74705SXin Li void *dummy3 = &({ ; }); // expected-error {{cannot take the address of an rvalue of type 'void'}} 120*67e74705SXin Li } 121