• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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