Viewing file: delete1.C (1.34 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// { 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; }
|