1// RUN: %clang_cc1 -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  // 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
39struct 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
54union { // expected-warning{{declaration does not declare anything}}
55  int int_val;
56  float float_val;
57};
58
59static union { // expected-warning{{declaration does not declare anything}}
60  int int_val2;
61  float float_val2;
62};
63
64void f() {
65  int_val2 = 0; // expected-error{{use of undeclared identifier}}
66  float_val2 = 0.0; // expected-error{{use of undeclared identifier}}
67}
68
69void 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>
79struct s0 { union { int f0; }; };
80
81// <rdar://problem/6481130>
82typedef struct { }; // expected-warning{{typedef requires a name}}
83
84// PR3675
85struct 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
93struct {}; // expected-warning{{declaration does not declare anything}}
94
95struct 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.
102typedef struct {
103  int x;
104} a_struct;
105int 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.
108struct s {
109  struct { int i; };
110  int a[];
111};
112
113// PR20930
114struct s3 {
115  struct { int A __attribute__((deprecated)); }; // expected-note {{'A' has been explicitly marked deprecated here}}
116};
117
118void deprecated_anonymous_struct_member(void) {
119  struct s3 s;
120  s.A = 1; // expected-warning {{'A' is deprecated}}
121}
122