diff --git a/include/boost/core/lightweight_test.hpp b/include/boost/core/lightweight_test.hpp index 43baea0..267ba66 100644 --- a/include/boost/core/lightweight_test.hpp +++ b/include/boost/core/lightweight_test.hpp @@ -551,39 +551,56 @@ inline void lwt_init() #define BOOST_TEST_ALL_EQ(begin1, end1, begin2, end2) ( ::boost::detail::test_all_eq_impl(BOOST_LIGHTWEIGHT_TEST_OSTREAM, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, begin1, end1, begin2, end2) ) #define BOOST_TEST_ALL_WITH(begin1, end1, begin2, end2, predicate) ( ::boost::detail::test_all_with_impl(BOOST_LIGHTWEIGHT_TEST_OSTREAM, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, begin1, end1, begin2, end2, predicate) ) -#ifndef BOOST_NO_EXCEPTIONS - #define BOOST_TEST_THROWS( EXPR, EXCEP ) \ - try { \ - EXPR; \ - ::boost::detail::throw_failed_impl \ - (#EXPR, #EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ - } \ - catch(EXCEP const&) { \ - ::boost::detail::test_results(); \ - } \ - catch(...) { \ - ::boost::detail::throw_failed_impl \ - (#EXPR, #EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ - } \ - // +#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1900) +// The usual idiom for multiline macros. But disabled for MSVC versions +// prior to 2015, which would emit a "conditional expression is constant" +// warning that we could not silence with a _Pragma, despite this being +// the same thing described here: +// +// . +// + #define BOOST_LWT_DETAIL_DO_WHILE_FALSE( x ) do { x } while (false) #else - #define BOOST_TEST_THROWS( EXPR, EXCEP ) + #define BOOST_LWT_DETAIL_DO_WHILE_FALSE( x ) x #endif #ifndef BOOST_NO_EXCEPTIONS -# define BOOST_TEST_NO_THROW(EXPR) \ - try { \ - EXPR; \ - } catch (const std::exception& e) { \ - ::boost::detail::no_throw_failed_impl \ - (#EXPR, e.what(), __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ - } catch (...) { \ - ::boost::detail::no_throw_failed_impl \ - (#EXPR, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ - } + #define BOOST_TEST_THROWS( EXPR, EXCEP ) \ + BOOST_LWT_DETAIL_DO_WHILE_FALSE( \ + try { \ + EXPR; \ + ::boost::detail::throw_failed_impl \ + (#EXPR, #EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ + } \ + catch(EXCEP const&) { \ + ::boost::detail::test_results(); \ + } \ + catch(...) { \ + ::boost::detail::throw_failed_impl \ + (#EXPR, #EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ + } \ + ) + // +#else + #define BOOST_TEST_THROWS( EXPR, EXCEP ) BOOST_LWT_DETAIL_DO_WHILE_FALSE((void)0;) +#endif + +#ifndef BOOST_NO_EXCEPTIONS +# define BOOST_TEST_NO_THROW(EXPR) \ + BOOST_LWT_DETAIL_DO_WHILE_FALSE( \ + try { \ + EXPR; \ + } catch (const std::exception& e) { \ + ::boost::detail::no_throw_failed_impl \ + (#EXPR, e.what(), __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ + } catch (...) { \ + ::boost::detail::no_throw_failed_impl \ + (#EXPR, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \ + } \ + ) // #else -# define BOOST_TEST_NO_THROW(EXPR) { EXPR; } +# define BOOST_TEST_NO_THROW(EXPR) BOOST_LWT_DETAIL_DO_WHILE_FALSE(EXPR;) #endif #endif // #ifndef BOOST_CORE_LIGHTWEIGHT_TEST_HPP