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