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 // UNSUPPORTED: c++98, c++03, c++11, c++14
11
12 // XFAIL: with_system_cxx_lib=macosx10.12
13 // XFAIL: with_system_cxx_lib=macosx10.11
14 // XFAIL: with_system_cxx_lib=macosx10.10
15 // XFAIL: with_system_cxx_lib=macosx10.9
16 // XFAIL: with_system_cxx_lib=macosx10.7
17 // XFAIL: with_system_cxx_lib=macosx10.8
18
19 // <any>
20
21 // any& operator=(any &&);
22
23 // Test move assignment.
24
25 #include <any>
26 #include <cassert>
27
28 #include "any_helpers.h"
29 #include "test_macros.h"
30
31 using std::any;
32 using std::any_cast;
33
34 template <class LHS, class RHS>
test_move_assign()35 void test_move_assign() {
36 assert(LHS::count == 0);
37 assert(RHS::count == 0);
38 {
39 LHS const s1(1);
40 any a(s1);
41 RHS const s2(2);
42 any a2(s2);
43
44 assert(LHS::count == 2);
45 assert(RHS::count == 2);
46
47 a = std::move(a2);
48
49 assert(LHS::count == 1);
50 assert(RHS::count == 2 + a2.has_value());
51 LIBCPP_ASSERT(RHS::count == 2); // libc++ leaves the object empty
52
53 assertContains<RHS>(a, 2);
54 if (a2.has_value())
55 assertContains<RHS>(a2, 0);
56 LIBCPP_ASSERT(!a2.has_value());
57 }
58 assert(LHS::count == 0);
59 assert(RHS::count == 0);
60 }
61
62 template <class LHS>
test_move_assign_empty()63 void test_move_assign_empty() {
64 assert(LHS::count == 0);
65 {
66 any a;
67 any a2((LHS(1)));
68
69 assert(LHS::count == 1);
70
71 a = std::move(a2);
72
73 assert(LHS::count == 1 + a2.has_value());
74 LIBCPP_ASSERT(LHS::count == 1);
75
76 assertContains<LHS>(a, 1);
77 if (a2.has_value())
78 assertContains<LHS>(a2, 0);
79 LIBCPP_ASSERT(!a2.has_value());
80 }
81 assert(LHS::count == 0);
82 {
83 any a((LHS(1)));
84 any a2;
85
86 assert(LHS::count == 1);
87
88 a = std::move(a2);
89
90 assert(LHS::count == 0);
91
92 assertEmpty<LHS>(a);
93 assertEmpty(a2);
94 }
95 assert(LHS::count == 0);
96 }
97
test_move_assign_noexcept()98 void test_move_assign_noexcept() {
99 any a1;
100 any a2;
101 static_assert(
102 noexcept(a1 = std::move(a2))
103 , "any & operator=(any &&) must be noexcept"
104 );
105 }
106
main()107 int main() {
108 test_move_assign_noexcept();
109 test_move_assign<small1, small2>();
110 test_move_assign<large1, large2>();
111 test_move_assign<small, large>();
112 test_move_assign<large, small>();
113 test_move_assign_empty<small>();
114 test_move_assign_empty<large>();
115 }
116