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