int main() { BOOST_TEST( boost::exception_ptr()==boost::exception_ptr() ); BOOST_TEST( !(boost::exception_ptr()!=boost::exception_ptr()) ); BOOST_TEST( !boost::exception_ptr() ); int count=0; try { throw boost::enable_current_exception(derives_nothing(count)); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( derives_nothing & ) { } catch( ... ) { BOOST_TEST(false); } } BOOST_TEST(count==0); try { throw boost::enable_current_exception(derives_std_exception()); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( derives_std_exception & ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( derives_std_exception & ) { } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } try { throw derives_std_exception(); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & e ) { #ifndef BOOST_NO_RTTI std::type_info const * const * t=boost::get_error_info<boost::original_exception_type>(e); BOOST_TEST(t!=0 && *t!=0 && **t==typeid(derives_std_exception)); #endif } catch( ... ) { BOOST_TEST(false); } } test_std_exception_what<std::domain_error>(); test_std_exception_what<std::invalid_argument>(); test_std_exception_what<std::length_error>(); test_std_exception_what<std::out_of_range>(); test_std_exception_what<std::logic_error>(); test_std_exception_what<std::range_error>(); test_std_exception_what<std::overflow_error>(); test_std_exception_what<std::underflow_error>(); test_std_exception_what<std::ios_base::failure>(); test_std_exception_what<std::runtime_error>(); test_std_exception<std::bad_alloc>(); #ifndef BOOST_NO_TYPEID test_std_exception<std::bad_cast>(); test_std_exception<std::bad_typeid>(); #endif test_std_exception<std::bad_exception>(); test_std_exception<std::exception>(); try { throw derives_std_boost_exception() << my_info(42); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( int const * p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); #ifndef BOOST_NO_RTTI { std::type_info const * const * t=boost::get_error_info<boost::original_exception_type>(x); BOOST_TEST(t && *t && **t==typeid(derives_std_boost_exception)); } #endif boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( int const * p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); #ifndef BOOST_NO_RTTI std::type_info const * const * t=boost::get_error_info<boost::original_exception_type>(x); BOOST_TEST(t && *t && **t==typeid(derives_std_boost_exception)); #endif } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } try { throw derives_boost_exception() << my_info(42); } catch( ... ) { boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( int const * p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); #ifndef BOOST_NO_RTTI { std::type_info const * const * t=boost::get_error_info<boost::original_exception_type>(x); BOOST_TEST(t && *t && **t==typeid(derives_boost_exception)); } #endif boost::exception_ptr p = boost::current_exception(); BOOST_TEST(!(p==boost::exception_ptr())); BOOST_TEST(p!=boost::exception_ptr()); BOOST_TEST(p); try { rethrow_exception(p); BOOST_TEST(false); } catch( boost::unknown_exception & x ) { BOOST_TEST(boost::get_error_info<my_info>(x)); if( int const * p=boost::get_error_info<my_info>(x) ) BOOST_TEST(*p==42); } catch( ... ) { BOOST_TEST(false); } } catch( ... ) { BOOST_TEST(false); } } test_throw_on_copy<std::bad_alloc,std::bad_alloc>(); test_throw_on_copy<int,std::bad_exception>(); try { throw boost::enable_current_exception(derives_std_boost_exception("what1")); } catch( ... ) { boost::exception_ptr p=boost::current_exception(); { std::string s=diagnostic_information(p); BOOST_TEST(s.find("what1")!=s.npos); } try { throw boost::enable_current_exception(derives_std_boost_exception("what2") << nested_exception(p) ); } catch( ... ) { std::string s=boost::current_exception_diagnostic_information(); BOOST_TEST(s.find("what1")!=s.npos); BOOST_TEST(s.find("what2")!=s.npos); } } BOOST_TEST(!diagnostic_information(boost::exception_ptr()).empty()); return boost::report_errors(); }
void throw_test_exception<derives_boost_exception>( int x ) { boost::throw_exception( derives_boost_exception(x) ); }