1 // ehopt was only copying one statement from the cleanup of the B temporary 2 // into the following try block, so we lost its destructor call. 3 4 // { dg-do run } 5 6 template <class T, class U> 7 class A; 8 9 bool b; 10 int count; 11 12 template <> 13 class A<int, int> 14 { 15 public: 16 A(int) { ++count; if (b) throw 1; } 17 A(const A&) { ++count; if (b) throw 1; } 18 ~A() { --count; if (b) throw 1; } 19 }; 20 21 typedef A<int, int> B; 22 23 template <> 24 class A<void *, void *> 25 { 26 public: 27 A() { if (b) throw 1; } 28 A(const B&) { if (b) throw 1; } 29 ~A() { if (b) throw 1; } 30 }; 31 32 typedef A<void *, void *> C; 33 34 void f() { if (b) throw 1; } 35 36 int 37 main (void) 38 { 39 { 40 C a(1); 41 f(); 42 } 43 return count; 44 } 45