1 // { dg-do run { target c++2a } } 2 3 #include <new> 4 5 int adt, adl; 6 struct A { ~AA7 ~A() { ++adt; } deleteA8 void operator delete (A *p, std::destroying_delete_t) { 9 ++adl; 10 if (adt) __builtin_abort(); 11 p->~A(); 12 ::operator delete (p); 13 } 14 }; 15 16 struct B { ~BB17 virtual ~B() {} deleteB18 void operator delete(void*, std::size_t) { __builtin_abort(); } 19 }; 20 21 int edel, edtor; 22 struct E : B { ~EE23 ~E() { ++edtor; } deleteE24 void operator delete(E *p, std::destroying_delete_t) { 25 ++edel; 26 if (edtor) __builtin_abort(); 27 p->~E(); 28 ::operator delete(p); 29 } 30 }; main()31int main() { 32 A* ap = new A; 33 delete ap; 34 if (adl != 1 || adt != 1) 35 __builtin_abort(); 36 37 B* bp = new E; 38 delete bp; // 2: uses E::operator delete(E*, std::destroying_delete_t) 39 if (edel != 1 || edtor != 1) 40 __builtin_abort(); 41 } 42