1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 struct 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 
test_unqual_references(struct X x,const struct X xc)24 void test_unqual_references(struct X x, const struct X xc) {
25   // expected-note@-1 3{{variable 'xc' declared const here}}
26   x.i = 0;
27   x.f = 0.0;
28   x.f2 = x.f;
29   x.d = x.f;
30   x.f3 = 0; // expected-error{{no member named 'f3'}}
31   x.a = 0;
32 
33   xc.d = 0.0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}}
34   xc.f = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}}
35   xc.a = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}}
36 }
37 
38 
39 struct Redecl {
40   int x; // expected-note{{previous declaration is here}}
41   struct y { }; // expected-warning{{declaration does not declare anything}}
42 
43   union {
44     int x; // expected-error{{member of anonymous union redeclares 'x'}}
45     float y;
46     double z; // expected-note{{previous declaration is here}}
47     double zz; // expected-note{{previous declaration is here}}
48   };
49 
50   int z; // expected-error{{duplicate member 'z'}}
51   void zz(); // expected-error{{duplicate member 'zz'}}
52 };
53 
54 union { // expected-warning{{declaration does not declare anything}}
55   int int_val;
56   float float_val;
57 };
58 
59 static union { // expected-warning{{declaration does not declare anything}}
60   int int_val2;
61   float float_val2;
62 };
63 
f()64 void f() {
65   int_val2 = 0; // expected-error{{use of undeclared identifier}}
66   float_val2 = 0.0; // expected-error{{use of undeclared identifier}}
67 }
68 
g()69 void g() {
70   union { // expected-warning{{declaration does not declare anything}}
71     int i;
72     float f2;
73   };
74   i = 0; // expected-error{{use of undeclared identifier}}
75   f2 = 0.0; // expected-error{{use of undeclared identifier}}
76 }
77 
78 // <rdar://problem/6483159>
79 struct s0 { union { int f0; }; };
80 
81 // <rdar://problem/6481130>
82 typedef struct { }; // expected-warning{{typedef requires a name}}
83 
84 // PR3675
85 struct s1 {
86   int f0; // expected-note{{previous declaration is here}}
87   union {
88     int f0; // expected-error{{member of anonymous union redeclares 'f0'}}
89   };
90 };
91 
92 // PR3680
93 struct {}; // expected-warning{{declaration does not declare anything}}
94 
95 struct s2 {
96   union {
97     int a;
98   } // expected-warning{{expected ';' at end of declaration list}}
99 }; // expected-error{{expected member name or ';' after declaration specifiers}}
100 
101 // Make sure we don't a.k.a. anonymous structs.
102 typedef struct {
103   int x;
104 } a_struct;
105 int tmp = (a_struct) { .x = 0 }; // expected-error {{initializing 'int' with an expression of incompatible type 'a_struct'}}
106 
107 // This example comes out of the C11 standard; make sure we don't accidentally reject it.
108 struct s {
109   struct { int i; };
110   int a[];
111 };
112 
113 // PR20930
114 struct s3 {
115   struct { int A __attribute__((deprecated)); }; // expected-note {{'A' has been explicitly marked deprecated here}}
116 };
117 
118 void deprecated_anonymous_struct_member(void) {
119   struct s3 s;
120   s.A = 1; // expected-warning {{'A' is deprecated}}
121 }
122