| // { dg-do run } |
| // Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> |
| // DR193: Order of destruction of local automatics of destructor |
| |
| extern "C" void abort(void); |
| |
| namespace N1 { |
| bool a_done = false; |
| struct A |
| { |
| ~A() |
| { |
| a_done = true; |
| } |
| }; |
| |
| struct B |
| { |
| ~B() |
| { |
| if (!a_done) |
| abort(); |
| } |
| }; |
| |
| struct C { |
| B x; |
| ~C() { |
| A y; |
| } |
| }; |
| } |
| |
| |
| namespace N2 { |
| bool a_done = false; |
| |
| template <class> |
| struct A |
| { |
| ~A() |
| { |
| a_done = true; |
| } |
| }; |
| |
| template <class> |
| struct B |
| { |
| ~B() |
| { |
| if (!a_done) |
| abort(); |
| } |
| }; |
| |
| template <class T> |
| struct C { |
| B<T> x; |
| ~C() { |
| A<T> y; |
| } |
| }; |
| } |
| |
| |
| int main(void) |
| { |
| N1::C c1; |
| N2::C<void> c2; |
| return 0; |
| } |