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()45 int 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