// PR c++/15764 // { dg-do run } #ifdef __GXX_EXPERIMENTAL_CXX0X__ #define NOEXCEPT_FALSE noexcept (false) #else #define NOEXCEPT_FALSE #endif extern "C" void abort (); int thrown; int as; struct a { a () { ++as; } ~a () NOEXCEPT_FALSE { --as; if (thrown++ == 0) throw 42; } }; int f (a const&) { return 1; } int f (a const&, a const&) { return 1; } int bs; int as_sav; struct b { b (...) { ++bs; } ~b () { --bs; as_sav = as; } }; bool p; void g() { if (p) throw 42; } int main () { thrown = 0; try { b tmp(f (a(), a())); g(); } catch (...) {} // We throw when the first a is destroyed, which should destroy b before // the other a. if (as_sav != 1) abort (); thrown = 0; try { b tmp(f (a())); g(); } catch (...) {} if (bs != 0) abort (); }