shared_ptr_Y_rv.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The LLVM Compiler Infrastructure 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// <memory> 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// shared_ptr 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// template<class Y> shared_ptr(shared_ptr<Y>&& r); 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <memory> 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <type_traits> 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <cassert> 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct B 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static int count; 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) B() {++count;} 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) B(const B&) {++count;} 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~B() {--count;} 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int B::count = 0; 30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)struct A 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) : public B 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){ 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) static int count; 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) A() {++count;} 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) A(const A&) {++count;} 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ~A() {--count;} 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int A::count = 0; 425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct C 445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static int count; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) C() {++count;} 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) C(const C&) {++count;} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~C() {--count;} 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 51a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int C::count = 0; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int main() 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_assert(( std::is_convertible<std::shared_ptr<A>, std::shared_ptr<B> >::value), ""); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_assert((!std::is_convertible<std::shared_ptr<B>, std::shared_ptr<A> >::value), ""); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static_assert((!std::is_convertible<std::shared_ptr<A>, std::shared_ptr<C> >::value), ""); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::shared_ptr<A> pA(new A); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pA.use_count() == 1); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 1); 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) assert(A::count == 1); 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) B* p = pA.get(); 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) std::shared_ptr<B> pB(std::move(pA)); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 1); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(A::count == 1); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef _LIBCPP_MOVE 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pB.use_count() == 1); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pA.use_count() == 0); 72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#else 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) assert(pB.use_count() == 2); 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) assert(pA.use_count() == 2); 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(p == pB.get()); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef _LIBCPP_MOVE 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pA.use_count() == 0); 801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) assert(B::count == 0); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(A::count == 0); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pA.use_count() == 1); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 1); 851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) assert(A::count == 1); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 0); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(A::count == 0); 901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) { 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::shared_ptr<A> pA; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pA.use_count() == 0); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 0); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(A::count == 0); 951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) { 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::shared_ptr<B> pB(pA); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 0); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(A::count == 0); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pB.use_count() == 0); 1001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) assert(pA.use_count() == 0); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pA.get() == pB.get()); 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(pA.use_count() == 0); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 0); 1051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) assert(A::count == 0); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(B::count == 0); 1085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) assert(A::count == 0); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)