anonymous-struct-union.c revision e950d4bbb7c785c7a7abdd0ad98f372b8c7980b8
1// RUN: clang -fsyntax-only -verify %s
2struct X {
3  union {
4    float f3;
5    double d2;
6  } named;
7
8  union {
9    int i;
10    float f;
11
12    union {
13      float f2;
14      double d;
15    };
16  };
17
18  struct {
19    int a;
20    float b;
21  };
22};
23
24void test_unqual_references(struct X x, const struct X xc) {
25  x.i = 0;
26  x.f = 0.0;
27  x.f2 = x.f;
28  x.d = x.f;
29  x.f3 = 0; // expected-error{{no member named 'f3'}}
30  x.a = 0;
31
32  xc.d = 0.0; // expected-error{{read-only variable is not assignable}}
33  xc.f = 0; // expected-error{{read-only variable is not assignable}}
34  xc.a = 0; // expected-error{{read-only variable is not assignable}}
35}
36
37
38struct Redecl {
39  int x; // expected-note{{previous declaration is here}}
40  struct y { };
41
42  union {
43    int x; // expected-error{{member of anonymous union redeclares 'x'}}
44    float y;
45    double z; // expected-note{{previous declaration is here}}
46    double zz; // expected-note{{previous declaration is here}}
47  };
48
49  int z; // expected-error{{duplicate member 'z'}}
50  void zz(); // expected-error{{duplicate member 'zz'}}
51};
52
53union { // expected-error{{declaration does not declare anything}}
54  int int_val;
55  float float_val;
56};
57
58static union { // expected-error{{declaration does not declare anything}}
59  int int_val2;
60  float float_val2;
61};
62
63void f() {
64  int_val2 = 0; // expected-error{{use of undeclared identifier}}
65  float_val2 = 0.0; // expected-error{{use of undeclared identifier}}
66}
67
68void g() {
69  union { // expected-error{{declaration does not declare anything}}
70    int i;
71    float f2;
72  };
73  i = 0; // expected-error{{use of undeclared identifier}}
74  f2 = 0.0; // expected-error{{use of undeclared identifier}}
75}
76
77// <rdar://problem/6483159>
78struct s0 { union { int f0; }; };
79
80// <rdar://problem/6481130>
81typedef struct { }; // expected-error{{declaration does not declare anything}}
82
83// PR3675
84struct s1 {
85  int f0; // expected-note{{previous declaration is here}}
86  union {
87    int f0; // expected-error{{member of anonymous union redeclares 'f0'}}
88  };
89};
90
91// PR3680
92struct {}; // expected-error{{declaration does not declare anything}}
93
94struct s2 {
95  union {
96    int a;
97  }
98}; // expected-error{{expected member name or ';' after declaration specifiers}}
99