| // 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 T, class U> |
| class A; |
| |
| bool b; |
| int count; |
| |
| template <> |
| class A<int, int> |
| { |
| public: |
| A(int) { ++count; if (b) throw 1; } |
| A(const A&) { ++count; if (b) throw 1; } |
| ~A() |
| #if __cplusplus <= 201402L |
| throw(int) // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } } |
| #else |
| noexcept(false) |
| #endif |
| { --count; if (b) throw 1; } |
| }; |
| |
| typedef A<int, int> B; |
| |
| template <> |
| class A<void *, void *> |
| { |
| public: |
| A() { if (b) throw 1; } |
| A(const B&) { if (b) throw 1; } |
| ~A() |
| #if __cplusplus <= 201402L |
| throw(int) // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } } |
| #else |
| noexcept(false) |
| #endif |
| { if (b) throw 1; } |
| }; |
| |
| typedef A<void *, void *> C; |
| |
| void f() { if (b) throw 1; } |
| |
| int |
| main (void) |
| { |
| { |
| C a(1); |
| f(); |
| } |
| return count; |
| } |