1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//===----------------------------------------------------------------------===//
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//                     The LLVM Compiler Infrastructure
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// This file is dual licensed under the MIT and the University of Illinois Open
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// Source Licenses. See LICENSE.TXT for details.
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//===----------------------------------------------------------------------===//
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// <memory>
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// weak_ptr
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// template<class Y> weak_ptr& operator=(const weak_ptr<Y>& r);
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project#include <memory>
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project#include <type_traits>
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project#include <cassert>
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectstruct B
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static int count;
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    B() {++count;}
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    B(const B&) {++count;}
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    virtual ~B() {--count;}
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project};
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectint B::count = 0;
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectstruct A
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    : public B
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static int count;
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    A() {++count;}
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    A(const A&) {++count;}
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    ~A() {--count;}
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project};
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectint A::count = 0;
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectint main()
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        const std::shared_ptr<A> ps(new A);
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        const std::weak_ptr<A> pA(ps);
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            std::weak_ptr<B> pB;
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            pB = pA;
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            assert(B::count == 1);
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            assert(A::count == 1);
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            assert(pB.use_count() == 1);
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            assert(pA.use_count() == 1);
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        assert(pA.use_count() == 1);
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        assert(B::count == 1);
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        assert(A::count == 1);
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    assert(B::count == 0);
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    assert(A::count == 0);
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        const std::shared_ptr<A> ps(new A);
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        std::weak_ptr<A> pA(ps);
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            std::weak_ptr<B> pB;
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            pB = std::move(pA);
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            assert(B::count == 1);
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            assert(A::count == 1);
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            assert(pB.use_count() == 1);
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        assert(B::count == 1);
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        assert(A::count == 1);
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    assert(B::count == 0);
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    assert(A::count == 0);
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project}
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project