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