1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // UNSUPPORTED: c++98, c++03, c++11
14 // any& operator=(any const &);
16 // Test value copy and move assignment.
18 #include <experimental/any>
21 #include "experimental_any_helpers.h"
22 #include "count_new.hpp"
23 #include "test_macros.h"
25 using std::experimental::any;
26 using std::experimental::any_cast;
28 template <class LHS, class RHS>
29 void test_assign_value() {
30 assert(LHS::count == 0);
31 assert(RHS::count == 0);
36 any const rhs(RHS(2));
38 assert(LHS::count == 1);
39 assert(RHS::count == 1);
40 assert(RHS::copied == 0);
44 assert(RHS::copied == 1);
45 assert(LHS::count == 0);
46 assert(RHS::count == 2);
48 assertContains<RHS>(lhs, 2);
49 assertContains<RHS>(rhs, 2);
51 assert(LHS::count == 0);
52 assert(RHS::count == 0);
59 assert(LHS::count == 1);
60 assert(RHS::count == 1);
61 assert(RHS::moved == 1);
65 assert(RHS::moved >= 1);
66 assert(RHS::copied == 0);
67 assert(LHS::count == 0);
68 assert(RHS::count == 1);
70 assertContains<RHS>(lhs, 2);
71 assertEmpty<RHS>(rhs);
73 assert(LHS::count == 0);
74 assert(RHS::count == 0);
78 void test_assign_value_empty() {
79 assert(RHS::count == 0);
84 assert(RHS::count == 1);
85 assert(RHS::copied == 0);
89 assert(RHS::count == 2);
90 assert(RHS::copied == 1);
91 assert(RHS::moved >= 0);
92 assertContains<RHS>(lhs, 42);
94 assert(RHS::count == 0);
99 assert(RHS::count == 1);
100 assert(RHS::moved == 0);
102 lhs = std::move(rhs);
104 assert(RHS::count == 2);
105 assert(RHS::copied == 0);
106 assert(RHS::moved >= 1);
107 assertContains<RHS>(lhs, 42);
109 assert(RHS::count == 0);
114 template <class Tp, bool Move = false>
115 void test_assign_throws() {
116 #if !defined(TEST_HAS_NO_EXCEPTIONS)
118 [](any& lhs, auto&& rhs) {
120 Move ? lhs = std::move(rhs)
123 } catch (my_any_exception const &) {
129 // const lvalue to empty
133 assert(Tp::count == 1);
137 assert(Tp::count == 1);
138 assertEmpty<Tp>(lhs);
143 assert(small::count == 1);
144 assert(Tp::count == 1);
148 assert(small::count == 1);
149 assert(Tp::count == 1);
150 assertContains<small>(lhs, 2);
155 assert(large::count == 1);
156 assert(Tp::count == 1);
160 assert(large::count == 1);
161 assert(Tp::count == 1);
162 assertContains<large>(lhs, 2);
168 test_assign_value<small1, small2>();
169 test_assign_value<large1, large2>();
170 test_assign_value<small, large>();
171 test_assign_value<large, small>();
172 test_assign_value_empty<small>();
173 test_assign_value_empty<large>();
174 test_assign_throws<small_throws_on_copy>();
175 test_assign_throws<large_throws_on_copy>();
176 test_assign_throws<throws_on_move, /* Move = */ true>();