// ehopt was only copying one statement from the cleanup of the B temporary // into the following try block, so we lost its destructor call. // { dg-do run } template class A; bool b; int count; template <> class A { public: A(int) { ++count; if (b) throw 1; } A(const A&) { ++count; if (b) throw 1; } ~A() { --count; if (b) throw 1; } }; typedef A B; template <> class A { public: A() { if (b) throw 1; } A(const B&) { if (b) throw 1; } ~A() { if (b) throw 1; } }; typedef A C; void f() { if (b) throw 1; } int main (void) { { C a(1); f(); } return count; }