expr-address-of.c revision b104b1f6ca76cefab25c6ecb5df3bf87a0f875d3
1// RUN: clang %s -verify -fsyntax-only
2struct xx { int bitf:1; };
3
4struct entry { struct xx *whatever;
5               int value;
6               int bitf:1; };
7void add_one(int *p) { (*p)++; }
8
9void 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
18void 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
28void 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
34typedef __attribute__(( ext_vector_type(4) ))  float float4;
35
36float *testExtVectorComponentAccess(float4 x) {
37  return &x.w; // expected-error {{address of vector element requested}}
38}
39
40void f0() {
41  register int *x0;
42  int *_dummy0 = &(*x0);
43
44  register int *x1;
45  int *_dummy1 = &(*(x1 + 1));
46}
47
48void f1() {
49  register int x0[10];
50  int *_dummy0 = &(*x0); // expected-error {{address of register variable requested}}
51
52  register int x1[10];
53  int *_dummy1 = &(*(x1 + 1)); // expected-error {{address of register variable requested}}
54
55  register int *x2;
56  int *_dummy2 = &(*(x2 + 1));
57
58  register int x3[10][10][10];
59  int *_dummy3 = &x3[0][0]; // expected-error {{address of register variable requested}}
60
61  register struct { int f0[10]; } x4;
62  int *_dummy4 = &x4.f0[2]; // expected-error {{address of register variable requested}}
63}
64
65void f2() {
66  register int *y;
67
68  int *_dummy0 = &y; // expected-error {{address of register variable requested}}
69  int *_dummy1 = &y[10];
70}
71
72void f3() {
73  extern void f4();
74  void (*_dummy0)() = &****f4;
75}
76
77void f4() {
78  register _Complex int x;
79
80  int *_dummy0 = &__real__ x; // expected-error {{address of register variable requested}}
81}
82
83void f5() {
84  register int arr[2];
85
86  /* This is just here because if we happened to support this as an
87     lvalue we would need to give a warning. Note that gcc warns about
88     this as a register before it warns about it as an invalid
89     lvalue. */
90  int *_dummy0 = &(int*) arr; // expected-error {{address expression must be an lvalue or a function designator}}
91  int *_dummy1 = &(arr + 1); // expected-error {{address expression must be an lvalue or a function designator}}
92}
93
94void f6(register int x) {
95  int * dummy0 = &x; // expected-error {{address of register variable requested}}
96}
97