diff --git a/include/boost/assert.hpp b/include/boost/assert.hpp index 595e6d5..1713d9b 100644 --- a/include/boost/assert.hpp +++ b/include/boost/assert.hpp @@ -24,134 +24,55 @@ // // -// BOOST_ASSERT +// BOOST_ASSERT, BOOST_ASSERT_MSG // #undef BOOST_ASSERT - -#if defined(BOOST_DISABLE_ASSERTS) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && defined(NDEBUG) ) - -# define BOOST_ASSERT(expr) ((void)0) - -#elif defined(BOOST_ENABLE_ASSERT_HANDLER) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && !defined(NDEBUG) ) - -#include -#include - -namespace boost -{ - void assertion_failed(char const * expr, char const * function, char const * file, long line); // user defined -} // namespace boost - -#define BOOST_ASSERT(expr) (BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)) - -#else -# include // .h to support old libraries w/o - effect is the same -# define BOOST_ASSERT(expr) assert(expr) -#endif - -// -// BOOST_ASSERT_MSG -// - #undef BOOST_ASSERT_MSG #if defined(BOOST_DISABLE_ASSERTS) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && defined(NDEBUG) ) +# define BOOST_ASSERT(expr) ((void)0) # define BOOST_ASSERT_MSG(expr, msg) ((void)0) #elif defined(BOOST_ENABLE_ASSERT_HANDLER) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && !defined(NDEBUG) ) -#include +#include // for BOOST_LIKELY #include namespace boost { - void assertion_failed_msg(char const * expr, char const * msg, char const * function, char const * file, long line); // user defined + void assertion_failed(char const * expr, char const * function, char const * file, long line); // user defined + void assertion_failed_msg(char const * expr, char const * msg, char const * function, char const * file, long line); // user defined } // namespace boost +#define BOOST_ASSERT(expr) (BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)) #define BOOST_ASSERT_MSG(expr, msg) (BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed_msg(#expr, msg, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)) #else -# include + +# include // .h to support old libraries w/o - effect is the same + +# define BOOST_ASSERT(expr) assert(expr) # define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg)) -/* - #ifndef BOOST_ASSERT_HPP - #define BOOST_ASSERT_HPP - #include - #include - #include - #include - - // IDE's like Visual Studio perform better if output goes to std::cout or - // some other stream, so allow user to configure output stream: - #ifndef BOOST_ASSERT_MSG_OSTREAM - # define BOOST_ASSERT_MSG_OSTREAM std::cerr - #endif - - namespace boost - { - namespace assertion - { - namespace detail - { - // Note: The template is needed to make the function non-inline and avoid linking errors - template< typename CharT > - BOOST_NOINLINE void assertion_failed_msg(CharT const * expr, char const * msg, char const * function, - char const * file, long line) - { - BOOST_ASSERT_MSG_OSTREAM - << "***** Internal Program Error - assertion (" << expr << ") failed in " - << function << ":\n" - << file << '(' << line << "): " << msg << std::endl; -#ifdef UNDER_CE - // The Windows CE CRT library does not have abort() so use exit(-1) instead. - std::exit(-1); -#else - std::abort(); -#endif - } - } // detail - } // assertion - } // detail - #endif - - #define BOOST_ASSERT_MSG(expr, msg) (BOOST_LIKELY(!!(expr)) \ - ? ((void)0) \ - : ::boost::assertion::detail::assertion_failed_msg(#expr, msg, \ - BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)) -*/ #endif // -// BOOST_VERIFY +// BOOST_VERIFY, BOOST_VERIFY_MSG // #undef BOOST_VERIFY - -#if defined(BOOST_DISABLE_ASSERTS) || ( !defined(BOOST_ENABLE_ASSERT_HANDLER) && defined(NDEBUG) ) - -# define BOOST_VERIFY(expr) ((void)(expr)) - -#else - -# define BOOST_VERIFY(expr) BOOST_ASSERT(expr) - -#endif - -// -// BOOST_VERIFY_MSG -// - #undef BOOST_VERIFY_MSG #if defined(BOOST_DISABLE_ASSERTS) || ( !defined(BOOST_ENABLE_ASSERT_HANDLER) && defined(NDEBUG) ) +# define BOOST_VERIFY(expr) ((void)(expr)) # define BOOST_VERIFY_MSG(expr, msg) ((void)(expr)) #else +# define BOOST_VERIFY(expr) BOOST_ASSERT(expr) # define BOOST_VERIFY_MSG(expr, msg) BOOST_ASSERT_MSG(expr,msg) #endif diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 4993ed9..22fed2a 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -19,4 +19,6 @@ test-suite "assert" [ run exp/assert_msg_exp_test.cpp ] [ run exp/verify_exp_test.cpp ] [ run exp/verify_msg_exp_test.cpp ] + [ run assert_test2.cpp ] + [ run assert_msg_test2.cpp ] ; diff --git a/test/assert_msg_test2.cpp b/test/assert_msg_test2.cpp new file mode 100644 index 0000000..9d8f8da --- /dev/null +++ b/test/assert_msg_test2.cpp @@ -0,0 +1,114 @@ +// +// assert_msg_test2.cpp - a test for BOOST_ASSERT_MSG and NDEBUG +// +// Copyright (c) 2014 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// + +#include +#include + +// default case, !NDEBUG +// BOOST_ASSERT_MSG(x) -> assert(x) + +#undef NDEBUG +#include + +void test_default() +{ + int x = 1; + + BOOST_ASSERT_MSG( 1, "msg" ); + BOOST_ASSERT_MSG( x, "msg" ); + BOOST_ASSERT_MSG( x == 1, "msg" ); +} + +// default case, NDEBUG +// BOOST_ASSERT_MSG(x) -> assert(x) + +#define NDEBUG +#include + +void test_default_ndebug() +{ + int x = 1; + + BOOST_ASSERT_MSG( 1, "msg" ); + BOOST_ASSERT_MSG( x, "msg" ); + BOOST_ASSERT_MSG( x == 1, "msg" ); + + BOOST_ASSERT_MSG( 0, "msg" ); + BOOST_ASSERT_MSG( !x, "msg" ); + BOOST_ASSERT_MSG( x == 0, "msg" ); +} + +// BOOST_ENABLE_ASSERT_DEBUG_HANDLER, !NDEBUG +// same as BOOST_ENABLE_ASSERT_HANDLER + +#define BOOST_ENABLE_ASSERT_DEBUG_HANDLER + +#undef NDEBUG +#include + +int handler_invoked = 0; + +void boost::assertion_failed_msg( char const * expr, char const * msg, char const * function, char const * file, long line ) +{ + printf( "Expression: %s\nMessage: %s\nFunction: %s\nFile: %s\nLine: %ld\n\n", expr, msg, function, file, line ); + ++handler_invoked; +} + +void test_debug_handler() +{ + handler_invoked = 0; + + int x = 1; + + BOOST_ASSERT_MSG( 1, "msg" ); + BOOST_ASSERT_MSG( x, "msg" ); + BOOST_ASSERT_MSG( x == 1, "msg" ); + + BOOST_ASSERT_MSG( 0, "msg" ); + BOOST_ASSERT_MSG( !x, "msg" ); + BOOST_ASSERT_MSG( x == 0, "msg" ); + + BOOST_TEST( handler_invoked == 3 ); +} + +// BOOST_ENABLE_ASSERT_DEBUG_HANDLER, NDEBUG +// BOOST_ASSERT_MSG(x) -> ((void)0) + +#define NDEBUG +#include + +void test_debug_handler_ndebug() +{ + handler_invoked = 0; + + int x = 1; + + BOOST_ASSERT_MSG( 1, "msg" ); + BOOST_ASSERT_MSG( x, "msg" ); + BOOST_ASSERT_MSG( x == 1, "msg" ); + + BOOST_ASSERT_MSG( 0, "msg" ); + BOOST_ASSERT_MSG( !x, "msg" ); + BOOST_ASSERT_MSG( x == 0, "msg" ); + + BOOST_TEST( handler_invoked == 0 ); +} + +#undef BOOST_ENABLE_ASSERT_DEBUG_HANDLER + +int main() +{ + test_default(); + test_default_ndebug(); + test_debug_handler(); + test_debug_handler_ndebug(); + + return boost::report_errors(); +} diff --git a/test/assert_test2.cpp b/test/assert_test2.cpp new file mode 100644 index 0000000..5a8a37f --- /dev/null +++ b/test/assert_test2.cpp @@ -0,0 +1,114 @@ +// +// assert_test2.cpp - a test for BOOST_ASSERT and NDEBUG +// +// Copyright (c) 2014 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// + +#include +#include + +// default case, !NDEBUG +// BOOST_ASSERT(x) -> assert(x) + +#undef NDEBUG +#include + +void test_default() +{ + int x = 1; + + BOOST_ASSERT( 1 ); + BOOST_ASSERT( x ); + BOOST_ASSERT( x == 1 ); +} + +// default case, NDEBUG +// BOOST_ASSERT(x) -> assert(x) + +#define NDEBUG +#include + +void test_default_ndebug() +{ + int x = 1; + + BOOST_ASSERT( 1 ); + BOOST_ASSERT( x ); + BOOST_ASSERT( x == 1 ); + + BOOST_ASSERT( 0 ); + BOOST_ASSERT( !x ); + BOOST_ASSERT( x == 0 ); +} + +// BOOST_ENABLE_ASSERT_DEBUG_HANDLER, !NDEBUG +// same as BOOST_ENABLE_ASSERT_HANDLER + +#define BOOST_ENABLE_ASSERT_DEBUG_HANDLER + +#undef NDEBUG +#include + +int handler_invoked = 0; + +void boost::assertion_failed( char const * expr, char const * function, char const * file, long line ) +{ + printf( "Expression: %s\nFunction: %s\nFile: %s\nLine: %ld\n\n", expr, function, file, line ); + ++handler_invoked; +} + +void test_debug_handler() +{ + handler_invoked = 0; + + int x = 1; + + BOOST_ASSERT( 1 ); + BOOST_ASSERT( x ); + BOOST_ASSERT( x == 1 ); + + BOOST_ASSERT( 0 ); + BOOST_ASSERT( !x ); + BOOST_ASSERT( x == 0 ); + + BOOST_TEST( handler_invoked == 3 ); +} + +// BOOST_ENABLE_ASSERT_DEBUG_HANDLER, NDEBUG +// BOOST_ASSERT(x) -> ((void)0) + +#define NDEBUG +#include + +void test_debug_handler_ndebug() +{ + handler_invoked = 0; + + int x = 1; + + BOOST_ASSERT( 1 ); + BOOST_ASSERT( x ); + BOOST_ASSERT( x == 1 ); + + BOOST_ASSERT( 0 ); + BOOST_ASSERT( !x ); + BOOST_ASSERT( x == 0 ); + + BOOST_TEST( handler_invoked == 0 ); +} + +#undef BOOST_ENABLE_ASSERT_DEBUG_HANDLER + +int main() +{ + test_default(); + test_default_ndebug(); + test_debug_handler(); + test_debug_handler_ndebug(); + + return boost::report_errors(); +}