|  | // RUN: %clang_cc1 -fsyntax-only -verify %s | 
|  | struct X { | 
|  | union { | 
|  | float f3; | 
|  | double d2; | 
|  | } named; | 
|  |  | 
|  | union { | 
|  | int i; | 
|  | float f; | 
|  |  | 
|  | union { | 
|  | float f2; | 
|  | double d; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | struct { | 
|  | int a; | 
|  | float b; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | void test_unqual_references(struct X x, const struct X xc) { | 
|  | // expected-note@-1 3{{variable 'xc' declared const here}} | 
|  | x.i = 0; | 
|  | x.f = 0.0; | 
|  | x.f2 = x.f; | 
|  | x.d = x.f; | 
|  | x.f3 = 0; // expected-error{{no member named 'f3'}} | 
|  | x.a = 0; | 
|  |  | 
|  | xc.d = 0.0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}} | 
|  | xc.f = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}} | 
|  | xc.a = 0; // expected-error{{cannot assign to variable 'xc' with const-qualified type 'const struct X'}} | 
|  | } | 
|  |  | 
|  |  | 
|  | struct Redecl { | 
|  | int x; // expected-note{{previous declaration is here}} | 
|  | struct y { }; // expected-warning{{declaration does not declare anything}} | 
|  |  | 
|  | union { | 
|  | int x; // expected-error{{member of anonymous union redeclares 'x'}} | 
|  | float y; | 
|  | double z; // expected-note{{previous declaration is here}} | 
|  | double zz; // expected-note{{previous declaration is here}} | 
|  | }; | 
|  |  | 
|  | int z; // expected-error{{duplicate member 'z'}} | 
|  | void zz(); // expected-error{{duplicate member 'zz'}} | 
|  | }; | 
|  |  | 
|  | union { // expected-warning{{declaration does not declare anything}} | 
|  | int int_val; | 
|  | float float_val; | 
|  | }; | 
|  |  | 
|  | static union { // expected-warning{{declaration does not declare anything}} | 
|  | int int_val2; | 
|  | float float_val2; | 
|  | }; | 
|  |  | 
|  | void f() { | 
|  | int_val2 = 0; // expected-error{{use of undeclared identifier}} | 
|  | float_val2 = 0.0; // expected-error{{use of undeclared identifier}} | 
|  | } | 
|  |  | 
|  | void g() { | 
|  | union { // expected-warning{{declaration does not declare anything}} | 
|  | int i; | 
|  | float f2; | 
|  | }; | 
|  | i = 0; // expected-error{{use of undeclared identifier}} | 
|  | f2 = 0.0; // expected-error{{use of undeclared identifier}} | 
|  | } | 
|  |  | 
|  | // <rdar://problem/6483159> | 
|  | struct s0 { union { int f0; }; }; | 
|  |  | 
|  | // <rdar://problem/6481130> | 
|  | typedef struct { }; // expected-warning{{typedef requires a name}} | 
|  |  | 
|  | // PR3675 | 
|  | struct s1 { | 
|  | int f0; // expected-note{{previous declaration is here}} | 
|  | union { | 
|  | int f0; // expected-error{{member of anonymous union redeclares 'f0'}} | 
|  | }; | 
|  | }; | 
|  |  | 
|  | // PR3680 | 
|  | struct {}; // expected-warning{{declaration does not declare anything}} | 
|  |  | 
|  | struct s2 { | 
|  | union { | 
|  | int a; | 
|  | } // expected-warning{{expected ';' at end of declaration list}} | 
|  | }; // expected-error{{expected member name or ';' after declaration specifiers}} | 
|  |  | 
|  | // Make sure we don't a.k.a. anonymous structs. | 
|  | typedef struct { | 
|  | int x; | 
|  | } a_struct; | 
|  | int tmp = (a_struct) { .x = 0 }; // expected-error {{initializing 'int' with an expression of incompatible type 'a_struct'}} | 
|  |  | 
|  | // This example comes out of the C11 standard; make sure we don't accidentally reject it. | 
|  | struct s { | 
|  | struct { int i; }; | 
|  | int a[]; | 
|  | }; | 
|  |  | 
|  | // PR20930 | 
|  | struct s3 { | 
|  | struct { int A __attribute__((deprecated)); }; // expected-note {{'A' has been explicitly marked deprecated here}} | 
|  | }; | 
|  |  | 
|  | void deprecated_anonymous_struct_member(void) { | 
|  | struct s3 s; | 
|  | s.A = 1; // expected-warning {{'A' is deprecated}} | 
|  | } |