expr-address-of.c revision 33ad0120264da35db85ff8cccee5f08da6a7fbeb
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 requested}}
32}
33
34
35void f0() {
36  register int *x0;
37  int *_dummy0 = &(*x0);
38
39  register int *x1;
40  int *_dummy1 = &(*(x1 + 1));
41}
42
43void f1() {
44  register int x0[10];
45  int *_dummy0 = &(*x0); // expected-error {{address of register variable requested}}
46
47  register int x1[10];
48  int *_dummy1 = &(*(x1 + 1)); // expected-error {{address of register variable requested}}
49
50  register int *x2;
51  int *_dummy2 = &(*(x2 + 1));
52
53  register int x3[10][10][10];
54  int *_dummy3 = &x3[0][0]; // expected-error {{address of register variable requested}}
55
56  register struct { int f0[10]; } x4;
57  int *_dummy4 = &x4.f0[2]; // expected-error {{address of register variable requested}}
58}
59
60void f2() {
61  register int *y;
62
63  int *_dummy0 = &y; // expected-error {{address of register variable requested}}
64  int *_dummy1 = &y[10];
65}
66
67void f3() {
68  extern void f4();
69  void (*_dummy0)() = &****f4;
70}
71
72void f4() {
73  register _Complex int x;
74
75  int *_dummy0 = &__real__ x; // expected-error {{address of register variable requested}}
76}
77
78void f5() {
79  register int arr[2];
80
81  /* This is just here because if we happened to support this as an
82     lvalue we would need to give a warning. Note that gcc warns about
83     this as a register before it warns about it as an invalid
84     lvalue. */
85  int *_dummy0 = &(int*) arr; // expected-error {{address expression must be an lvalue or a function designator}}
86  int *_dummy1 = &(arr + 1); // expected-error {{address expression must be an lvalue or a function designator}}
87}
88
89void f6(register int x) {
90  int * dummy0 = &x; // expected-error {{address of register variable requested}}
91}
92