1// { dg-do run } 2// { dg-options "-O2" } 3// Testcase for order of destruction. 4 5extern "C" int printf (const char *, ...); 6int c; 7int r; 8 9struct B { 10 B(); 11 B( B const& ); 12 ~B(); 13}; 14 15struct A { 16 A(); 17 A( A const& ); 18 ~A(); 19 operator B (); 20}; 21 22inline A::operator B () { printf( "operator B ()\n"); return B(); } 23 24A f(); 25void g( B const& ); 26 27int 28main() 29{ 30 g( f() ); 31 return r; 32} 33 34B::B() { printf( "B::B()\n" ); if (++c != 2) r = 1; } 35B::B( B const& ) { printf( "B::B( B const& )\n" ); r = 1; } 36B::~B() { printf( "B::~B()\n" ); if (--c != 1) r = 1; } 37 38A::A() { printf( "A::A()\n" ); if (++c != 1) r = 1; } 39A::A( A const& ) { printf( "A::A( A const& )\n" ); r = 1; } 40A::~A() { printf( "A::~A()\n" ); if (--c != 0) r = 1; } 41 42A f() { printf( "f()\n"); return A(); } 43void g( B const& ) { printf( "g()\n"); } 44