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