diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index a8e070f..6b0edbb 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -38,11 +38,21 @@ BOOST_NORETURN BOOST_NOINLINE inline void throw_exception_from_error( error_code boost::throw_with_location( system_error( e ), loc ); } +BOOST_NORETURN BOOST_NOINLINE inline void throw_exception_from_error( errc::errc_t const & e, boost::source_location const& loc ) +{ + boost::throw_with_location( system_error( make_error_code( e ) ), loc ); +} + BOOST_NORETURN BOOST_NOINLINE inline void throw_exception_from_error( std::error_code const & e, boost::source_location const& loc ) { boost::throw_with_location( std::system_error( e ), loc ); } +BOOST_NORETURN BOOST_NOINLINE inline void throw_exception_from_error( std::errc const & e, boost::source_location const& loc ) +{ + boost::throw_with_location( std::system_error( make_error_code( e ) ), loc ); +} + #if defined(__GNUC__) && __GNUC__ >= 7 && __GNUC__ <= 8 # pragma GCC diagnostic pop #endif diff --git a/test/result_value_access.cpp b/test/result_value_access.cpp index b8b00f4..1f045c4 100644 --- a/test/result_value_access.cpp +++ b/test/result_value_access.cpp @@ -182,6 +182,34 @@ int main() BOOST_TEST_EQ( r.operator->(), static_cast(0) ); } + { + result const r( in_place_error, errc::invalid_argument ); + + BOOST_TEST( !r.has_value() ); + BOOST_TEST( r.has_error() ); + + BOOST_TEST_NOT( r ); + BOOST_TEST( !r ); + + BOOST_TEST_THROWS( r.value(), system_error ); + + BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + } + + { + result const r( std::errc::invalid_argument ); + + BOOST_TEST( !r.has_value() ); + BOOST_TEST( r.has_error() ); + + BOOST_TEST_NOT( r ); + BOOST_TEST( !r ); + + BOOST_TEST_THROWS( r.value(), std::system_error ); + + BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + } + { result r( 1 ); @@ -374,5 +402,33 @@ int main() BOOST_TEST_EQ( r.operator->(), static_cast(0) ); } + { + result const r( in_place_error, errc::invalid_argument ); + + BOOST_TEST( !r.has_value() ); + BOOST_TEST( r.has_error() ); + + BOOST_TEST_NOT( r ); + BOOST_TEST( !r ); + + BOOST_TEST_THROWS( r.value(), system_error ); + + BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + } + + { + result const r( std::errc::invalid_argument ); + + BOOST_TEST( !r.has_value() ); + BOOST_TEST( r.has_error() ); + + BOOST_TEST_NOT( r ); + BOOST_TEST( !r ); + + BOOST_TEST_THROWS( r.value(), std::system_error ); + + BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + } + return boost::report_errors(); }