1 // Runtime test for C++11 unrestricted unions 2 // { dg-do run { target c++11 } } 3 4 int c, d; 5 struct A 6 { 7 int i; AA8 A(): i(1) { ++c; } AA9 A(const A&): i(2) { ++c; } ~AA10 ~A() { ++d; } 11 }; 12 13 union B 14 { 15 A a; B()16 B() { } B(const B & b)17 B(const B& b) { } ~B()18 ~B() { } 19 }; 20 21 struct C 22 { 23 union { A a; }; CC24 C() { } CC25 C(const C&) { } ~CC26 ~C() { } 27 }; 28 29 union D 30 { 31 A a; D()32 D(): a() { } D(const D & d)33 D(const D& d): a(d.a) { } ~D()34 ~D() { a.~A(); } 35 }; 36 37 struct E 38 { 39 union { A a; }; EE40 E(): a() { } EE41 E(const E& e): a (e.a) { } ~EE42 ~E() { a.~A(); } 43 }; 44 main()45int main() 46 { 47 { 48 B b1; 49 B b2(b1); 50 51 C c1; 52 C c2(c1); 53 } 54 55 if (c != 0 || d != 0) 56 return c+d*10; 57 58 { 59 D d1; 60 D d2(d1); 61 62 E e1; 63 E e2(e1); 64 } 65 66 if (c != 4 || d != 4) 67 return c*100+d*1000; 68 } 69