blob: 210a5a54c348c90920d0c416a0170fe7a0eff3a4 [file] [log] [blame]
// { dg-do run { target c++20 } }
#include <new>
int adt, adl;
struct A {
~A() { ++adt; }
void operator delete (A *p, std::destroying_delete_t) {
++adl;
if (adt) __builtin_abort();
p->~A();
::operator delete (p);
}
};
struct B {
virtual ~B() {}
void operator delete(void*, std::size_t) { __builtin_abort(); }
};
int edel, edtor;
struct E : B {
~E() { ++edtor; }
void operator delete(E *p, std::destroying_delete_t) {
++edel;
if (edtor) __builtin_abort();
p->~E();
::operator delete(p);
}
};
int main() {
A* ap = new A;
delete ap;
if (adl != 1 || adt != 1)
__builtin_abort();
B* bp = new E;
delete bp; // 2: uses E::operator delete(E*, std::destroying_delete_t)
if (edel != 1 || edtor != 1)
__builtin_abort();
}