anonymous-struct-union.c revision c7f811638f8603fa373d2be724e8b1c8ba51ad75
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 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-warning{{declaration does not declare anything}} 54 int int_val; 55 float float_val; 56}; 57 58static union { // expected-warning{{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-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> 78struct s0 { union { int f0; }; }; 79 80// <rdar://problem/6481130> 81typedef struct { }; // expected-warning{{typedef requires a name}} 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-warning{{declaration does not declare anything}} 93 94struct 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. 101typedef struct { 102 int x; 103} a_struct; 104int 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. 107struct s { 108 struct { int i; }; 109 int a[]; 110}; 111