variant_convert_construct_throw.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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_copy()
  32. {
  33. X::instances = 0;
  34. {
  35. variant<X> v1;
  36. BOOST_TEST_EQ( X::instances, 1 );
  37. try
  38. {
  39. variant<X, int, float> 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. void test_move()
  50. {
  51. X::instances = 0;
  52. {
  53. variant<X> v1;
  54. BOOST_TEST_EQ( X::instances, 1 );
  55. try
  56. {
  57. variant<X, int, float> v2( std::move( v1 ) );
  58. BOOST_TEST_EQ( X::instances, 2 );
  59. }
  60. catch( std::exception const& )
  61. {
  62. }
  63. BOOST_TEST_EQ( X::instances, 1 );
  64. }
  65. BOOST_TEST_EQ( X::instances, 0 );
  66. }
  67. int main()
  68. {
  69. test_copy();
  70. test_move();
  71. return boost::report_errors();
  72. }