1
2 // Copyright 2019 Peter Dimov
3 //
4 // Distributed under the Boost Software License, Version 1.0.
5 //
6 // See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt
8
9 #if defined(_MSC_VER)
10 # pragma warning( disable: 4702 ) // unreachable code
11 #endif
12
13 #include <boost/variant2/variant.hpp>
14 #include <boost/core/lightweight_test.hpp>
15 #include <stdexcept>
16
17 using namespace boost::variant2;
18
19 struct X
20 {
21 static int instances;
22
XX23 X()
24 {
25 ++instances;
26 }
27
XX28 X( X const& )
29 {
30 throw std::runtime_error( "X(X const&)" );
31 }
32
~XX33 ~X()
34 {
35 --instances;
36 }
37 };
38
39 int X::instances = 0;
40
test_copy()41 void test_copy()
42 {
43 X::instances = 0;
44
45 {
46 variant<X> v1;
47
48 BOOST_TEST_EQ( X::instances, 1 );
49
50 try
51 {
52 variant<X, int, float> v2( v1 );
53 BOOST_TEST_EQ( X::instances, 2 );
54 }
55 catch( std::exception const& )
56 {
57 }
58
59 BOOST_TEST_EQ( X::instances, 1 );
60 }
61
62 BOOST_TEST_EQ( X::instances, 0 );
63 }
64
test_move()65 void test_move()
66 {
67 X::instances = 0;
68
69 {
70 variant<X> v1;
71
72 BOOST_TEST_EQ( X::instances, 1 );
73
74 try
75 {
76 variant<X, int, float> v2( std::move( v1 ) );
77 BOOST_TEST_EQ( X::instances, 2 );
78 }
79 catch( std::exception const& )
80 {
81 }
82
83 BOOST_TEST_EQ( X::instances, 1 );
84 }
85
86 BOOST_TEST_EQ( X::instances, 0 );
87 }
88
main()89 int main()
90 {
91 test_copy();
92 test_move();
93
94 return boost::report_errors();
95 }
96