| // { dg-do run } |
| // { dg-xfail-run-if "AIX operator delete" { powerpc-ibm-aix* } } |
| |
| // pr 55635, the delete operator must be called, regardless of whether |
| // the dtor throws |
| |
| static int deleted; |
| |
| void operator delete (void *) throw () |
| { |
| deleted = 1; |
| } |
| |
| struct Foo { |
| ~Foo() |
| #if __cplusplus <= 201402L |
| throw(int) // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } } |
| #else |
| noexcept(false) |
| #endif |
| {throw 1;} |
| }; |
| |
| struct Baz { |
| void operator delete (void *) throw () |
| { |
| deleted = 2; |
| } |
| virtual ~Baz() |
| #if __cplusplus <= 201402L |
| throw(int) // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } } |
| #else |
| noexcept(false) |
| #endif |
| {throw 1;} |
| }; |
| |
| int non_virt () |
| { |
| deleted = 0; |
| |
| Foo *p = new Foo; |
| try { delete p; } |
| catch (...) { return deleted != 1;} |
| return 1; |
| } |
| |
| int virt_glob () |
| { |
| deleted = 0; |
| |
| Baz *p = ::new Baz; |
| try { ::delete p; } |
| catch (...) { return deleted != 1;} |
| return 1; |
| } |
| |
| int virt_del () |
| { |
| deleted = 0; |
| |
| Baz *p = new Baz; |
| try { delete p; } |
| catch (...) { return deleted != 2;} |
| return 1; |
| } |
| |
| int ary () |
| { |
| deleted = 0; |
| |
| Baz *p = new Baz[1]; |
| try { delete[] p; } |
| catch (...) { return deleted != 1;} |
| return 1; |
| } |
| |
| int main () |
| { |
| if (non_virt ()) |
| return 1; |
| |
| if (virt_glob ()) |
| return 2; |
| |
| if (virt_del ()) |
| return 3; |
| |
| if (ary ()) |
| return 4; |
| |
| return 0; |
| } |