1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // libc++ cannot safely provide the auto_ptr constructor without rvalue
11 // references.
12 // XFAIL: c++98, c++03
13 
14 // <memory>
15 
16 // unique_ptr
17 
18 // template <class U> unique_ptr(auto_ptr<U>&&) noexcept
19 
20 #include <memory>
21 #include <utility>
22 #include <cassert>
23 
24 #include "test_macros.h"
25 
26 struct A
27 {
28     static int count;
AA29     A() {++count;}
AA30     A(const A&) {++count;}
~AA31     virtual ~A() {--count;}
32 };
33 
34 int A::count = 0;
35 
36 struct B
37     : public A
38 {
39     static int count;
BB40     B() {++count;}
BB41     B(const B&) {++count;}
~BB42     virtual ~B() {--count;}
43 };
44 
45 int B::count = 0;
46 
main()47 int main()
48 {
49     {
50     B* p = new B;
51     std::auto_ptr<B> ap(p);
52     std::unique_ptr<A> up(std::move(ap));
53     assert(up.get() == p);
54     assert(ap.get() == 0);
55     assert(A::count == 1);
56     assert(B::count == 1);
57     }
58     assert(A::count == 0);
59     assert(B::count == 0);
60     {
61     B* p = new B;
62     std::auto_ptr<B> ap(p);
63     std::unique_ptr<A> up;
64     up = std::move(ap);
65     assert(up.get() == p);
66     assert(ap.get() == 0);
67     assert(A::count == 1);
68     assert(B::count == 1);
69     }
70     assert(A::count == 0);
71     assert(B::count == 0);
72 #if TEST_STD_VER >= 11
73     {
74         static_assert(std::is_nothrow_constructible<
75             std::unique_ptr<A>,
76             std::auto_ptr<B>&&
77         >::value, "");
78     }
79 #endif
80 }
81