destroying_delete_t.pass.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // struct destroying_delete_t {
  10. // explicit destroying_delete_t() = default;
  11. // };
  12. // inline constexpr destroying_delete_t destroying_delete{};
  13. // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
  14. #include <new>
  15. #include <cassert>
  16. #include "test_macros.h"
  17. struct A {
  18. void *data;
  19. A();
  20. ~A();
  21. static A* New();
  22. void operator delete(A*, std::destroying_delete_t);
  23. };
  24. bool A_constructed = false;
  25. bool A_destroyed = false;
  26. bool A_destroying_deleted = false;
  27. A::A() {
  28. A_constructed = true;
  29. }
  30. A::~A() {
  31. A_destroyed = true;
  32. }
  33. A* A::New() {
  34. return new(::operator new(sizeof(A))) A();
  35. }
  36. void A::operator delete(A* a, std::destroying_delete_t) {
  37. A_destroying_deleted = true;
  38. ::operator delete(a);
  39. }
  40. #ifndef __cpp_lib_destroying_delete
  41. #error "Expected __cpp_lib_destroying_delete to be defined"
  42. #elif __cpp_lib_destroying_delete < 201806L
  43. #error "Unexpected value of __cpp_lib_destroying_delete"
  44. #endif
  45. int main() {
  46. // Ensure that we call the destroying delete and not the destructor.
  47. A* ap = A::New();
  48. assert(A_constructed);
  49. delete ap;
  50. assert(!A_destroyed);
  51. assert(A_destroying_deleted);
  52. }