xref: /aosp_15_r20/external/clang/test/Sema/expr-address-of.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void add_one(int *p) { (*p)++; }
8*67e74705SXin Li 
test()9*67e74705SXin Li void 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 Li void 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 Li void 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 Li float *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 Li void 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 Li void 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 Li void 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 Li void f3() {
76*67e74705SXin Li   extern void f4();
77*67e74705SXin Li   void (*_dummy0)() = &****f4;
78*67e74705SXin Li }
79*67e74705SXin Li 
f4()80*67e74705SXin Li void 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 Li void 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 Li void 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 Li char* 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 Li void 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