From 11f102a9872f2d12f4a75bca8c5daafaded2eb97 Mon Sep 17 00:00:00 2001 From: Emil Dotchevski Date: Sun, 6 Aug 2023 15:20:29 -0700 Subject: [PATCH] Revert "Don't double-rethrow std::exception_ptr (#53)" This reverts commit ea70868a458ed9fd5fe5975d05bec8b9d61fbbcf. --- .../boost/exception/detail/exception_ptr.hpp | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/include/boost/exception/detail/exception_ptr.hpp b/include/boost/exception/detail/exception_ptr.hpp index af959a8..cdfc3be 100644 --- a/include/boost/exception/detail/exception_ptr.hpp +++ b/include/boost/exception/detail/exception_ptr.hpp @@ -44,48 +44,27 @@ boost exception_detail { #ifndef BOOST_NO_CXX11_HDR_EXCEPTION - class - BOOST_SYMBOL_VISIBLE - std_exception_ptr_clone_impl: - public virtual clone_base + struct + std_exception_ptr_wrapper: + std::exception { - std::exception_ptr p_; - - public: - - explicit std_exception_ptr_clone_impl( std::exception_ptr const & ptr ) BOOST_NOEXCEPT: - p_(ptr) + std::exception_ptr p; + explicit std_exception_ptr_wrapper( std::exception_ptr const & ptr ) BOOST_NOEXCEPT: + p(ptr) { } - - ~std_exception_ptr_clone_impl() BOOST_NOEXCEPT_OR_NOTHROW +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + explicit std_exception_ptr_wrapper( std::exception_ptr && ptr ) BOOST_NOEXCEPT: + p(static_cast(ptr)) { } - - private: - - std_exception_ptr_clone_impl( std_exception_ptr_clone_impl const & x ): - p_(x.p_) - { - } - - clone_base const* - clone() const - { - return new std_exception_ptr_clone_impl(*this); - } - - void - rethrow() const - { - std::rethrow_exception(p_); - } +#endif }; shared_ptr inline wrap_exception_ptr( std::exception_ptr const & e ) { - exception_detail::clone_base const & base = std_exception_ptr_clone_impl(e); + exception_detail::clone_base const & base = boost::enable_current_exception(std_exception_ptr_wrapper(e)); return shared_ptr(base.clone()); } #endif @@ -557,7 +536,20 @@ boost rethrow_exception_( exception_ptr const & p ) { BOOST_ASSERT(p); +#if defined( BOOST_NO_CXX11_HDR_EXCEPTION ) || defined( BOOST_NO_EXCEPTIONS ) p.ptr_->rethrow(); +#else + try + { + p.ptr_->rethrow(); + } + catch( + std_exception_ptr_wrapper const & wrp) + { + // if an std::exception_ptr was wrapped above then rethrow it + std::rethrow_exception(wrp.p); + } +#endif } }