shared_ptr_rv.pass.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. // <memory>
  10. // shared_ptr
  11. // shared_ptr& operator=(shared_ptr&& r);
  12. #include <memory>
  13. #include <type_traits>
  14. #include <cassert>
  15. struct B
  16. {
  17. static int count;
  18. B() {++count;}
  19. B(const B&) {++count;}
  20. virtual ~B() {--count;}
  21. };
  22. int B::count = 0;
  23. struct A
  24. : public B
  25. {
  26. static int count;
  27. A() {++count;}
  28. A(const A&) {++count;}
  29. ~A() {--count;}
  30. };
  31. int A::count = 0;
  32. int main()
  33. {
  34. #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
  35. {
  36. std::shared_ptr<A> pA(new A);
  37. A* ptrA = pA.get();
  38. {
  39. std::shared_ptr<A> pB(new A);
  40. pB = std::move(pA);
  41. assert(B::count == 1);
  42. assert(A::count == 1);
  43. assert(pB.use_count() == 1);
  44. assert(pA.use_count() == 0);
  45. assert(pA.get() == 0);
  46. assert(pB.get() == ptrA);
  47. }
  48. assert(pA.use_count() == 0);
  49. assert(B::count == 0);
  50. assert(A::count == 0);
  51. }
  52. assert(B::count == 0);
  53. assert(A::count == 0);
  54. {
  55. std::shared_ptr<A> pA;
  56. A* ptrA = pA.get();
  57. {
  58. std::shared_ptr<A> pB(new A);
  59. pB = std::move(pA);
  60. assert(B::count == 0);
  61. assert(A::count == 0);
  62. assert(pB.use_count() == 0);
  63. assert(pA.use_count() == 0);
  64. assert(pA.get() == 0);
  65. assert(pB.get() == ptrA);
  66. }
  67. assert(pA.use_count() == 0);
  68. assert(B::count == 0);
  69. assert(A::count == 0);
  70. }
  71. assert(B::count == 0);
  72. assert(A::count == 0);
  73. {
  74. std::shared_ptr<A> pA(new A);
  75. A* ptrA = pA.get();
  76. {
  77. std::shared_ptr<A> pB;
  78. pB = std::move(pA);
  79. assert(B::count == 1);
  80. assert(A::count == 1);
  81. assert(pB.use_count() == 1);
  82. assert(pA.use_count() == 0);
  83. assert(pA.get() == 0);
  84. assert(pB.get() == ptrA);
  85. }
  86. assert(pA.use_count() == 0);
  87. assert(B::count == 0);
  88. assert(A::count == 0);
  89. }
  90. assert(B::count == 0);
  91. assert(A::count == 0);
  92. {
  93. std::shared_ptr<A> pA;
  94. A* ptrA = pA.get();
  95. {
  96. std::shared_ptr<A> pB;
  97. pB = std::move(pA);
  98. assert(B::count == 0);
  99. assert(A::count == 0);
  100. assert(pB.use_count() == 0);
  101. assert(pA.use_count() == 0);
  102. assert(pA.get() == 0);
  103. assert(pB.get() == ptrA);
  104. }
  105. assert(pA.use_count() == 0);
  106. assert(B::count == 0);
  107. assert(A::count == 0);
  108. }
  109. assert(B::count == 0);
  110. assert(A::count == 0);
  111. #endif // _LIBCXX_HAS_NO_RVALUE_REFERENCES
  112. }