optional_test_noexcept_move.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright (C) 2014 Andrzej Krzemienski.
  2. //
  3. // Use, modification, and distribution is subject to the Boost Software
  4. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // See http://www.boost.org/lib/optional for documentation.
  8. //
  9. // You are welcome to contact the author at:
  10. // akrzemi1@gmail.com
  11. #include "boost/static_assert.hpp"
  12. #include "boost/optional/optional.hpp"
  13. #ifdef __BORLANDC__
  14. #pragma hdrstop
  15. #endif
  16. using boost::optional;
  17. #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
  18. #ifndef BOOST_NO_CXX11_NOEXCEPT
  19. // these 4 classes have different noexcept signatures in move operations
  20. struct NothrowBoth {
  21. NothrowBoth(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
  22. void operator=(NothrowBoth&&) BOOST_NOEXCEPT_IF(true) {};
  23. };
  24. struct NothrowCtor {
  25. NothrowCtor(NothrowCtor&&) BOOST_NOEXCEPT_IF(true) {};
  26. void operator=(NothrowCtor&&) BOOST_NOEXCEPT_IF(false) {};
  27. };
  28. struct NothrowAssign {
  29. NothrowAssign(NothrowAssign&&) BOOST_NOEXCEPT_IF(false) {};
  30. void operator=(NothrowAssign&&) BOOST_NOEXCEPT_IF(true) {};
  31. };
  32. struct NothrowNone {
  33. NothrowNone(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
  34. void operator=(NothrowNone&&) BOOST_NOEXCEPT_IF(false) {};
  35. };
  36. #if 0 // these also test type_traits, which are wrong
  37. void test_noexcept_as_defined() // this is a compile-time test
  38. {
  39. BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowBoth>::value);
  40. BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowBoth>::value);
  41. BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<NothrowCtor>::value);
  42. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowCtor>::value);
  43. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowAssign>::value);
  44. BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<NothrowAssign>::value);
  45. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<NothrowNone>::value);
  46. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<NothrowNone>::value);
  47. }
  48. void test_noexcept_on_optional_with_type_traits() // this is a compile-time test
  49. {
  50. BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowBoth> >::value);
  51. BOOST_STATIC_ASSERT(::boost::is_nothrow_move_assignable<optional<NothrowBoth> >::value);
  52. BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowBoth>()));
  53. BOOST_STATIC_ASSERT(::boost::is_nothrow_move_constructible<optional<NothrowCtor> >::value);
  54. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowCtor> >::value);
  55. BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowCtor>()));
  56. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowAssign> >::value);
  57. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowAssign> >::value);
  58. BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowAssign>()));
  59. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_constructible<optional<NothrowNone> >::value);
  60. BOOST_STATIC_ASSERT(!::boost::is_nothrow_move_assignable<optional<NothrowNone> >::value);
  61. BOOST_STATIC_ASSERT(BOOST_NOEXCEPT_EXPR(optional<NothrowNone>()));
  62. }
  63. #endif
  64. void test_noexcept_optional_with_operator() // compile-time test
  65. {
  66. typedef optional<NothrowBoth> ONx2;
  67. typedef optional<NothrowCtor> ONxC;
  68. typedef optional<NothrowAssign> ONxA;
  69. typedef optional<NothrowNone> ONx0;
  70. ONx2 onx2;
  71. ONxC onxC;
  72. ONxA onxA;
  73. ONx0 onx0;
  74. BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2() ));
  75. BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx2(boost::move(onx2)) ));
  76. BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( onx2 = ONx2() ));
  77. BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC() ));
  78. BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxC(boost::move(onxC)) ));
  79. BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxC = ONxC() ));
  80. BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONxA() ));
  81. BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONxA(boost::move(onxA)) ));
  82. BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onxA = ONxA() ));
  83. BOOST_STATIC_ASSERT( BOOST_NOEXCEPT_EXPR( ONx0() ));
  84. BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( ONx0(boost::move(onx0)) ));
  85. BOOST_STATIC_ASSERT(!BOOST_NOEXCEPT_EXPR( onx0 = ONx0() ));
  86. }
  87. #endif // !defned BOOST_NO_CXX11_NOEXCEPT
  88. #endif // !defined BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
  89. int main()
  90. {
  91. return 0;
  92. }