variant_copy_construct_throw.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright 2019 Peter Dimov
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. //
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. #if defined(_MSC_VER)
  8. # pragma warning( disable: 4702 ) // unreachable code
  9. #endif
  10. #include <boost/variant2/variant.hpp>
  11. #include <boost/core/lightweight_test.hpp>
  12. #include <stdexcept>
  13. using namespace boost::variant2;
  14. struct X
  15. {
  16. static int instances;
  17. X()
  18. {
  19. ++instances;
  20. }
  21. X( X const& )
  22. {
  23. throw std::runtime_error( "X(X const&)" );
  24. }
  25. ~X()
  26. {
  27. --instances;
  28. }
  29. };
  30. int X::instances = 0;
  31. void test()
  32. {
  33. X::instances = 0;
  34. {
  35. variant<X> v1;
  36. BOOST_TEST_EQ( X::instances, 1 );
  37. try
  38. {
  39. variant<X> v2( v1 );
  40. BOOST_TEST_EQ( X::instances, 2 );
  41. }
  42. catch( std::exception const& )
  43. {
  44. }
  45. BOOST_TEST_EQ( X::instances, 1 );
  46. }
  47. BOOST_TEST_EQ( X::instances, 0 );
  48. }
  49. int main()
  50. {
  51. test();
  52. return boost::report_errors();
  53. }