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 24 void 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 38 struct 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 53 union { // expected-warning{{declaration does not declare anything}} 54 int int_val; 55 float float_val; 56 }; 57 58 static union { // expected-warning{{declaration does not declare anything}} 59 int int_val2; 60 float float_val2; 61 }; 62 63 void f() { 64 int_val2 = 0; // expected-error{{use of undeclared identifier}} 65 float_val2 = 0.0; // expected-error{{use of undeclared identifier}} 66 } 67 68 void g() { 69 union { // expected-warning{{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> 78 struct s0 { union { int f0; }; }; 79 80 // <rdar://problem/6481130> 81 typedef struct { }; // expected-warning{{declaration does not declare anything}} 82 83 // PR3675 84 struct 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 92 struct {}; // expected-warning{{declaration does not declare anything}} 93 94 struct s2 { 95 union { 96 int a; 97 } // expected-warning{{expected ';' at end of declaration list}} 98 }; // expected-error{{expected member name or ';' after declaration specifiers}} 99 100 // Make sure we don't a.k.a. anonymous structs. 101 typedef struct { 102 int x; 103 } a_struct; 104 int tmp = (a_struct) { .x = 0 }; // expected-error {{initializing 'int' with an expression of incompatible type 'a_struct'}} 105 106 // This example comes out of the C11 standard; make sure we don't accidentally reject it. 107 struct s { 108 struct { int i; }; 109 int a[]; 110 }; 111