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:
A(int)16   A(int) { ++count; if (b) throw 1; }
A(const A &)17   A(const A&) { ++count; if (b) throw 1; }
~A()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:
A()27   A() { if (b) throw 1; }
A(const B &)28   A(const B&) { if (b) throw 1; }
~A()29   ~A() { if (b) throw 1; }
30 };
31 
32 typedef A<void *, void *> C;
33 
f()34 void f() { if (b) throw 1; }
35 
36 int
main(void)37 main (void)
38 {
39   {
40     C a(1);
41     f();
42   }
43   return count;
44 }
45