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
17using namespace boost::variant2;
18
19struct X
20{
21 static int instances;
22
23 X()
24 {
25 ++instances;
26 }
27
28 X( X const& )
29 {
30 throw std::runtime_error( "X(X const&)" );
31 }
32
33 ~X()
34 {
35 --instances;
36 }
37};
38
39int X::instances = 0;
40
41void 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
65void 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
89int main()
90{
91 test_copy();
92 test_move();
93
94 return boost::report_errors();
95}
96

source code of boost/libs/variant2/test/variant_convert_construct_throw.cpp