//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // struct destroying_delete_t { // explicit destroying_delete_t() = default; // }; // inline constexpr destroying_delete_t destroying_delete{}; // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 #include #include #include "test_macros.h" struct A { void *data; A(); ~A(); static A* New(); void operator delete(A*, std::destroying_delete_t); }; bool A_constructed = false; bool A_destroyed = false; bool A_destroying_deleted = false; A::A() { A_constructed = true; } A::~A() { A_destroyed = true; } A* A::New() { return new(::operator new(sizeof(A))) A(); } void A::operator delete(A* a, std::destroying_delete_t) { A_destroying_deleted = true; ::operator delete(a); } #ifndef __cpp_lib_destroying_delete #error "Expected __cpp_lib_destroying_delete to be defined" #elif __cpp_lib_destroying_delete < 201806L #error "Unexpected value of __cpp_lib_destroying_delete" #endif int main() { // Ensure that we call the destroying delete and not the destructor. A* ap = A::New(); assert(A_constructed); delete ap; assert(!A_destroyed); assert(A_destroying_deleted); }