diff gcc/testsuite/g++.dg/cpp2a/destroying-delete1.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gcc/testsuite/g++.dg/cpp2a/destroying-delete1.C	Thu Feb 13 11:34:05 2020 +0900
@@ -0,0 +1,41 @@
+// { dg-do run { target c++2a } }
+
+#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();
+}