anonymous-union.cpp revision d7d5f0223bd30dfd618762349c6209dd1d5ea3e6
1// RUN: clang-cc -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 mutable double d; 15 }; 16 }; 17 18 void test_unqual_references(); 19 20 struct { 21 int a; 22 float b; 23 }; 24 25 void test_unqual_references_const() const; 26 27 mutable union { // expected-error{{anonymous union at class scope must not have a storage specifier}} 28 float c1; 29 double c2; 30 }; 31}; 32 33void X::test_unqual_references() { 34 i = 0; 35 f = 0.0; 36 f2 = f; 37 d = f; 38 f3 = 0; // expected-error{{use of undeclared identifier 'f3'}} 39 a = 0; 40} 41 42void X::test_unqual_references_const() const { 43 d = 0.0; 44 f2 = 0; // expected-error{{read-only variable is not assignable}} 45 a = 0; // expected-error{{read-only variable is not assignable}} 46} 47 48void test_unqual_references(X x, const X xc) { 49 x.i = 0; 50 x.f = 0.0; 51 x.f2 = x.f; 52 x.d = x.f; 53 x.f3 = 0; // expected-error{{no member named 'f3'}} 54 x.a = 0; 55 56 xc.d = 0.0; 57 xc.f = 0; // expected-error{{read-only variable is not assignable}} 58 xc.a = 0; // expected-error{{read-only variable is not assignable}} 59} 60 61 62struct Redecl { 63 int x; // expected-note{{previous declaration is here}} 64 class y { }; 65 66 union { 67 int x; // expected-error{{member of anonymous union redeclares 'x'}} 68 float y; 69 double z; // expected-note{{previous declaration is here}} 70 double zz; // expected-note{{previous definition is here}} 71 }; 72 73 int z; // expected-error{{duplicate member 'z'}} 74 void zz(); // expected-error{{redefinition of 'zz' as different kind of symbol}} 75}; 76 77union { // expected-error{{anonymous unions at namespace or global scope must be declared 'static'}} 78 int int_val; 79 float float_val; 80}; 81 82static union { 83 int int_val2; 84 float float_val2; 85}; 86 87void f() { 88 int_val2 = 0; 89 float_val2 = 0.0; 90} 91 92void g() { 93 union { 94 int i; 95 float f2; 96 }; 97 i = 0; 98 f2 = 0.0; 99} 100 101struct BadMembers { 102 union { 103 struct X { }; // expected-error {{types cannot be declared in an anonymous union}} 104 struct { int x; int y; } y; 105 106 void f(); // expected-error{{functions cannot be declared in an anonymous union}} 107 private: int x1; // expected-error{{anonymous union cannot contain a private data member}} 108 protected: float x2; // expected-error{{anonymous union cannot contain a protected data member}} 109 }; 110}; 111 112// <rdar://problem/6481130> 113typedef union { }; // expected-error{{declaration does not declare anything}} 114