destroy_at.pass.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // UNSUPPORTED: c++98, c++03, c++11, c++14
  9. // <memory>
  10. // template <class _Tp>
  11. // void destroy_at(_Tp*);
  12. #include <memory>
  13. #include <cstdlib>
  14. #include <cassert>
  15. #include "test_macros.h"
  16. struct Counted {
  17. static int count;
  18. static void reset() { count = 0; }
  19. Counted() { ++count; }
  20. Counted(Counted const&) { ++count; }
  21. ~Counted() { --count; }
  22. friend void operator&(Counted) = delete;
  23. };
  24. int Counted::count = 0;
  25. struct VCounted {
  26. static int count;
  27. static void reset() { count = 0; }
  28. VCounted() { ++count; }
  29. VCounted(VCounted const&) { ++count; }
  30. virtual ~VCounted() { --count; }
  31. friend void operator&(VCounted) = delete;
  32. };
  33. int VCounted::count = 0;
  34. struct DCounted : VCounted {
  35. friend void operator&(DCounted) = delete;
  36. };
  37. int main(int, char**)
  38. {
  39. {
  40. void* mem1 = std::malloc(sizeof(Counted));
  41. void* mem2 = std::malloc(sizeof(Counted));
  42. assert(mem1 && mem2);
  43. assert(Counted::count == 0);
  44. Counted* ptr1 = ::new(mem1) Counted();
  45. Counted* ptr2 = ::new(mem2) Counted();
  46. assert(Counted::count == 2);
  47. std::destroy_at(ptr1);
  48. assert(Counted::count == 1);
  49. std::destroy_at(ptr2);
  50. assert(Counted::count == 0);
  51. std::free(mem1);
  52. std::free(mem2);
  53. }
  54. {
  55. void* mem1 = std::malloc(sizeof(DCounted));
  56. void* mem2 = std::malloc(sizeof(DCounted));
  57. assert(mem1 && mem2);
  58. assert(DCounted::count == 0);
  59. DCounted* ptr1 = ::new(mem1) DCounted();
  60. DCounted* ptr2 = ::new(mem2) DCounted();
  61. assert(DCounted::count == 2);
  62. assert(VCounted::count == 2);
  63. std::destroy_at(ptr1);
  64. assert(VCounted::count == 1);
  65. std::destroy_at(ptr2);
  66. assert(VCounted::count == 0);
  67. std::free(mem1);
  68. std::free(mem2);
  69. }
  70. return 0;
  71. }