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