| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // <memory> |
| // UNSUPPORTED: c++03, c++11, c++14 |
| |
| // template<class T> class shared_ptr |
| |
| // shared_ptr(weak_ptr<T>) -> shared_ptr<T> |
| // shared_ptr(unique_ptr<T>) -> shared_ptr<T> |
| |
| #include <memory> |
| #include <cassert> |
| #include <utility> |
| |
| #include "test_macros.h" |
| |
| struct A {}; |
| |
| struct D { |
| void operator()(A const* ptr) const |
| { |
| delete ptr; |
| } |
| }; |
| |
| int main(int, char**) |
| { |
| { |
| std::shared_ptr<A> s0(new A); |
| std::weak_ptr<A> w = s0; |
| auto s = std::shared_ptr(w); |
| ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>); |
| assert(s0.use_count() == 2); |
| assert(s.use_count() == 2); |
| assert(s0.get() == s.get()); |
| } |
| { |
| std::shared_ptr<A const> s0(new A); |
| std::weak_ptr<A const> w = s0; |
| auto s = std::shared_ptr(w); |
| ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>); |
| assert(s0.use_count() == 2); |
| assert(s.use_count() == 2); |
| assert(s0.get() == s.get()); |
| } |
| |
| { |
| std::unique_ptr<A> u(new A); |
| A* uPointee = u.get(); |
| std::shared_ptr s = std::move(u); |
| ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>); |
| assert(u == nullptr); |
| assert(s.get() == uPointee); |
| } |
| { |
| std::unique_ptr<A const> u(new A); |
| A const* uPointee = u.get(); |
| std::shared_ptr s = std::move(u); |
| ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>); |
| assert(u == nullptr); |
| assert(s.get() == uPointee); |
| } |
| |
| { |
| std::unique_ptr<A, D> u(new A, D{}); |
| A* uPointee = u.get(); |
| std::shared_ptr s(std::move(u)); |
| ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A>); |
| assert(u == nullptr); |
| assert(s.get() == uPointee); |
| } |
| { |
| std::unique_ptr<A const, D> u(new A, D{}); |
| A const* uPointee = u.get(); |
| std::shared_ptr s(std::move(u)); |
| ASSERT_SAME_TYPE(decltype(s), std::shared_ptr<A const>); |
| assert(u == nullptr); |
| assert(s.get() == uPointee); |
| } |
| |
| return 0; |
| } |