//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. //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) #define BOOST_NORETURN #include #if !defined( BOOST_NO_EXCEPTIONS ) # error This program requires exception handling disabled. #endif #include #include #include typedef boost::error_info answer; int exc_count; struct err: virtual boost::exception, virtual std::exception { err() { ++exc_count; } err( err const & ) { ++exc_count; } virtual ~err() BOOST_NOEXCEPT_OR_NOTHROW { --exc_count; } private: err & operator=( err const & ); }; namespace { bool throw_exception_called; } // It is not valid to return to the caller but we do for testing purposes. namespace boost { void throw_exception( std::exception const & e ) { throw_exception_called = true; BOOST_TEST(dynamic_cast(&e)!=0); int const * ans=boost::get_error_info(e); BOOST_TEST(ans && *ans==42); } struct source_location; void throw_exception( std::exception const & e, boost::source_location const & ) { throw_exception_called = true; BOOST_TEST(dynamic_cast(&e)!=0); int const * ans=boost::get_error_info(e); BOOST_TEST(ans && *ans==42); } } void simple_test() { boost::exception_ptr p = boost::copy_exception(err() << answer(42)); throw_exception_called = false; boost::exception_detail::rethrow_exception_(p); BOOST_TEST(throw_exception_called); } int main() { BOOST_TEST(++exc_count==1); simple_test(); BOOST_TEST(!--exc_count); return boost::report_errors(); }