explicit_operator_bool_noexcept.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright Andrey Semashev 2007 - 2013.
  3. * Distributed under the Boost Software License, Version 1.0.
  4. * (See accompanying file LICENSE_1_0.txt or copy at
  5. * http://www.boost.org/LICENSE_1_0.txt)
  6. */
  7. /*!
  8. * \file explicit_operator_bool_noexcept.cpp
  9. * \author Andrey Semashev
  10. * \date 26.04.2014
  11. *
  12. * \brief This test checks that explicit operator bool is noexcept when possible.
  13. */
  14. #define BOOST_TEST_MODULE explicit_operator_bool_noexcept
  15. #include <boost/config.hpp>
  16. #if !defined(BOOST_NO_CXX11_NOEXCEPT)
  17. #include <boost/detail/lightweight_test.hpp>
  18. #include <boost/utility/explicit_operator_bool.hpp>
  19. namespace {
  20. struct checkable1
  21. {
  22. BOOST_EXPLICIT_OPERATOR_BOOL()
  23. bool operator! () const
  24. {
  25. return false;
  26. }
  27. };
  28. struct checkable2
  29. {
  30. BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()
  31. BOOST_CONSTEXPR bool operator! () const
  32. {
  33. return false;
  34. }
  35. };
  36. struct noexcept_checkable1
  37. {
  38. BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()
  39. bool operator! () const noexcept
  40. {
  41. return false;
  42. }
  43. };
  44. struct noexcept_checkable2
  45. {
  46. BOOST_CONSTEXPR_EXPLICIT_OPERATOR_BOOL()
  47. BOOST_CONSTEXPR bool operator! () const noexcept
  48. {
  49. return false;
  50. }
  51. };
  52. } // namespace
  53. int main(int, char*[])
  54. {
  55. checkable1 val1;
  56. checkable2 val2;
  57. noexcept_checkable1 noexcept_val1;
  58. noexcept_checkable2 noexcept_val2;
  59. BOOST_TEST(!noexcept(static_cast< bool >(val1)));
  60. // constexpr functions are implicitly noexcept
  61. BOOST_TEST(noexcept(static_cast< bool >(val2)));
  62. BOOST_TEST(noexcept(static_cast< bool >(noexcept_val1)));
  63. BOOST_TEST(noexcept(static_cast< bool >(noexcept_val2)));
  64. return boost::report_errors();
  65. }
  66. #else
  67. int main(int, char*[])
  68. {
  69. return 0;
  70. }
  71. #endif