unique_ptr_Y.pass.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
16a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com//===----------------------------------------------------------------------===// 26a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// 36a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// The LLVM Compiler Infrastructure 46a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// 56a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// This file is distributed under the University of Illinois Open Source 66a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// License. See LICENSE.TXT for details. 76a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// 86a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com//===----------------------------------------------------------------------===// 96a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 106a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// <memory> 116a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 126a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// shared_ptr 136a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 146a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com// template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); 156a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 166a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com#include <memory> 176a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com#include <type_traits> 186a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com#include <cassert> 196a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 206a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.comstruct B 216a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com{ 226a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com static int count; 236a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 246a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com B() {++count;} 256a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com B(const B&) {++count;} 266a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com virtual ~B() {--count;} 276a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com}; 286a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 296a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.comint B::count = 0; 306a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 316a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.comstruct A 326a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com : public B 336a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com{ 346a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com static int count; 356a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 366a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com A() {++count;} 376a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com A(const A&) {++count;} 386a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com ~A() {--count;} 396a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com}; 406a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 416a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.comint A::count = 0; 426a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com 436a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.comint main() 446a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com{ 456a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com { 466a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com std::unique_ptr<A> pA(new A); 476a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com A* ptrA = pA.get(); 486a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com { 496a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com std::shared_ptr<B> pB(new B); 506a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com pB = std::move(pA); 516a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(B::count == 1); 526a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(A::count == 1); 536a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(pB.use_count() == 1); 546a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(pA.get() == 0); 556a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(pB.get() == ptrA); 566a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com } 576a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(B::count == 0); 586a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(A::count == 0); 596a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com } 606a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(B::count == 0); 616a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(A::count == 0); 626a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com { 636a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com std::unique_ptr<A> pA; 646a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com A* ptrA = pA.get(); 656a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com { 666a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com std::shared_ptr<B> pB(new B); 676a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com pB = std::move(pA); 686a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(B::count == 0); 696a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(A::count == 0); 706a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(pB.use_count() == 1); 716a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(pA.get() == 0); 726a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(pB.get() == ptrA); 736a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com } 746a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(B::count == 0); 756a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(A::count == 0); 766a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com } 776a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(B::count == 0); 786a98b8c0b5ffe1a23902cdf7e692f702b703eaebborenet@google.com assert(A::count == 0); 79 { 80 std::unique_ptr<A> pA(new A); 81 A* ptrA = pA.get(); 82 { 83 std::shared_ptr<B> pB; 84 pB = std::move(pA); 85 assert(B::count == 1); 86 assert(A::count == 1); 87 assert(pB.use_count() == 1); 88 assert(pA.get() == 0); 89 assert(pB.get() == ptrA); 90 } 91 assert(B::count == 0); 92 assert(A::count == 0); 93 } 94 assert(B::count == 0); 95 assert(A::count == 0); 96 { 97 std::unique_ptr<A> pA; 98 A* ptrA = pA.get(); 99 { 100 std::shared_ptr<B> pB; 101 pB = std::move(pA); 102 assert(B::count == 0); 103 assert(A::count == 0); 104 assert(pB.use_count() == 1); 105 assert(pA.get() == 0); 106 assert(pB.get() == ptrA); 107 } 108 assert(B::count == 0); 109 assert(A::count == 0); 110 } 111 assert(B::count == 0); 112 assert(A::count == 0); 113} 114