| // Runtime test for C++11 unrestricted unions |
| // { dg-do run { target c++11 } } |
| |
| int c, d; |
| struct A |
| { |
| int i; |
| A(): i(1) { ++c; } |
| A(const A&): i(2) { ++c; } |
| ~A() { ++d; } |
| }; |
| |
| union B |
| { |
| A a; |
| B() { } |
| B(const B& b) { } |
| ~B() { } |
| }; |
| |
| struct C |
| { |
| union { A a; }; |
| C() { } |
| C(const C&) { } |
| ~C() { } |
| }; |
| |
| union D |
| { |
| A a; |
| D(): a() { } |
| D(const D& d): a(d.a) { } |
| ~D() { a.~A(); } |
| }; |
| |
| struct E |
| { |
| union { A a; }; |
| E(): a() { } |
| E(const E& e): a (e.a) { } |
| ~E() { a.~A(); } |
| }; |
| |
| int main() |
| { |
| { |
| B b1; |
| B b2(b1); |
| |
| C c1; |
| C c2(c1); |
| } |
| |
| if (c != 0 || d != 0) |
| return c+d*10; |
| |
| { |
| D d1; |
| D d2(d1); |
| |
| E e1; |
| E e2(e1); |
| } |
| |
| if (c != 4 || d != 4) |
| return c*100+d*1000; |
| } |