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> 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> 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 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 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