From 9ead4aeea9ee26fc141d2a87be8e2f3551b32539 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 21 Feb 2026 03:26:49 +0200 Subject: [PATCH] Change operator* and operator-> to throw instead of having a precondition --- include/boost/system/result.hpp | 119 +++++++++++++++--------------- test/result_and_eq_fn1r.cpp | 6 +- test/result_and_fn1r.cpp | 20 ++--- test/result_and_mfn1r.cpp | 12 +-- test/result_convert_construct.cpp | 6 +- test/result_emplace.cpp | 9 +++ test/result_or_eq_fn0r.cpp | 18 ++--- test/result_or_eq_fn0v.cpp | 6 +- test/result_or_eq_value.cpp | 8 +- test/result_or_fn0r.cpp | 18 ++--- test/result_value_access.cpp | 90 +++++++++++++++------- test/result_value_construct.cpp | 11 ++- test/result_value_construct2.cpp | 9 +++ test/result_value_construct3.cpp | 13 +++- test/result_value_construct6.cpp | 11 ++- test/result_value_construct7.cpp | 13 +++- 16 files changed, 228 insertions(+), 141 deletions(-) diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index ba3b486..20ff010 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -205,7 +205,7 @@ public: { if( r2 ) { - v_.template emplace<0>( *r2 ); + v_.template emplace<0>( r2.unsafe_value() ); } } @@ -224,7 +224,7 @@ public: { if( r2 ) { - v_.template emplace<0>( std::move( *r2 ) ); + v_.template emplace<0>( std::move( r2 ).unsafe_value() ); } } @@ -317,73 +317,69 @@ public: #endif - // unchecked value access + // checked value access - BOOST_CXX14_CONSTEXPR T* operator->() noexcept + BOOST_CXX14_CONSTEXPR T* operator->() { - return variant2::get_if<0>( &v_ ); + return &value(); } - BOOST_CXX14_CONSTEXPR T const* operator->() const noexcept + BOOST_CXX14_CONSTEXPR T const* operator->() const { - return variant2::get_if<0>( &v_ ); + return &value(); } #if defined( BOOST_NO_CXX11_REF_QUALIFIERS ) - BOOST_CXX14_CONSTEXPR T& operator*() noexcept + BOOST_CXX14_CONSTEXPR T& operator*() { - BOOST_ASSERT( has_value() ); - return *operator->(); + return value(); } - BOOST_CXX14_CONSTEXPR T const& operator*() const noexcept + BOOST_CXX14_CONSTEXPR T const& operator*() const { - BOOST_ASSERT( has_value() ); - return *operator->(); + return value(); } #else - BOOST_CXX14_CONSTEXPR T& operator*() & noexcept + BOOST_CXX14_CONSTEXPR T& operator*() & { - BOOST_ASSERT( has_value() ); - return *operator->(); + return value(); } - BOOST_CXX14_CONSTEXPR T const& operator*() const & noexcept + BOOST_CXX14_CONSTEXPR T const& operator*() const & { - BOOST_ASSERT( has_value() ); - return *operator->(); + return value(); } template BOOST_CXX14_CONSTEXPR typename std::enable_if::value, T>::type - operator*() && noexcept(std::is_nothrow_move_constructible::value) + operator*() && { - return std::move(**this); + return std::move( value() ); } template BOOST_CXX14_CONSTEXPR typename std::enable_if::value, T&&>::type - operator*() && noexcept + operator*() && { - return std::move(**this); + return std::move( value() ); } template BOOST_CXX14_CONSTEXPR typename std::enable_if::value, T>::type - operator*() const && noexcept = delete; + operator*() const && = delete; template BOOST_CXX14_CONSTEXPR typename std::enable_if::value, T const&&>::type - operator*() const && noexcept + operator*() const && { - return std::move(**this); + return std::move( value() ); } #endif @@ -514,7 +510,7 @@ template std::basic_ostream& opera { if( r.has_value() ) { - os << "value:" << *r; + os << "value:" << r.unsafe_value(); } else { @@ -645,21 +641,23 @@ public: } } - // unchecked value access + // checked value access - BOOST_CXX14_CONSTEXPR void* operator->() noexcept + BOOST_CXX14_CONSTEXPR void* operator->() { - return variant2::get_if<0>( &v_ ); + value(); + return &variant2::unsafe_get<0>( v_ ); } - BOOST_CXX14_CONSTEXPR void const* operator->() const noexcept + BOOST_CXX14_CONSTEXPR void const* operator->() const { - return variant2::get_if<0>( &v_ ); + value(); + return &variant2::unsafe_get<0>( v_ ); } - BOOST_CXX14_CONSTEXPR void operator*() const noexcept + BOOST_CXX14_CONSTEXPR void operator*() const { - BOOST_ASSERT( has_value() ); + return value(); } // unchecked value access @@ -854,7 +852,7 @@ public: { if( r2 ) { - this->emplace( *r2 ); + this->emplace( r2.unsafe_value() ); } } @@ -889,17 +887,16 @@ public: } } - // unchecked value access + // checked value access - BOOST_CXX14_CONSTEXPR U* operator->() const noexcept + BOOST_CXX14_CONSTEXPR U* operator->() const { - return has_value()? variant2::unsafe_get<0>( v_ ): 0; + return &value(); } - BOOST_CXX14_CONSTEXPR U& operator*() const noexcept + BOOST_CXX14_CONSTEXPR U& operator*() const { - BOOST_ASSERT( has_value() ); - return *operator->(); + return value(); } // unchecked value access @@ -952,9 +949,9 @@ public: // equality friend constexpr bool operator==( result const & r1, result const & r2 ) - noexcept( noexcept( r1 && r2? *r1 == *r2: r1.v_ == r2.v_ ) ) + noexcept( noexcept( r1 && r2? r1.unsafe_value() == r2.unsafe_value(): r1.v_ == r2.v_ ) ) { - return r1 && r2? *r1 == *r2: r1.v_ == r2.v_; + return r1 && r2? r1.unsafe_value() == r2.unsafe_value(): r1.v_ == r2.v_; } friend constexpr bool operator!=( result const & r1, result const & r2 ) @@ -1006,7 +1003,7 @@ operator|( result const& r, U&& u ) { if( r ) { - return *r; + return r.unsafe_value(); } else { @@ -1022,7 +1019,7 @@ operator|( result&& r, U&& u ) { if( r ) { - return *std::move( r ); + return std::move( r ).unsafe_value(); } else { @@ -1040,7 +1037,7 @@ T operator|( result const& r, F&& f ) { if( r ) { - return *r; + return r.unsafe_value(); } else { @@ -1056,7 +1053,7 @@ T operator|( result&& r, F&& f ) { if( r ) { - return *std::move( r ); + return std::move( r ).unsafe_value(); } else { @@ -1076,7 +1073,7 @@ operator|( result const& r, F&& f ) { if( r ) { - return *r; + return r.unsafe_value(); } else { @@ -1095,7 +1092,7 @@ U operator|( result const& r, F&& f ) { if( r ) { - return *r; + return r.unsafe_value(); } else { @@ -1112,7 +1109,7 @@ U operator|( result&& r, F&& f ) { if( r ) { - return *std::move( r ); + return std::move( r ).unsafe_value(); } else { @@ -1222,7 +1219,7 @@ result operator&( result& r, F&& f ) } else { - return compat::invoke( std::forward( f ), *r ); + return compat::invoke( std::forward( f ), r.unsafe_value() ); } } @@ -1239,7 +1236,7 @@ result operator&( result const& r, F&& f ) } else { - return compat::invoke( std::forward( f ), *r ); + return compat::invoke( std::forward( f ), r.unsafe_value() ); } } @@ -1256,7 +1253,7 @@ result operator&( result&& r, F&& f ) } else { - return compat::invoke( std::forward( f ), *std::move( r ) ); + return compat::invoke( std::forward( f ), std::move( r ).unsafe_value() ); } } @@ -1273,7 +1270,7 @@ result operator&( result&& r, F&& f ) } else { - return compat::invoke( std::forward( f ), *std::move( r ) ); + return compat::invoke( std::forward( f ), std::move( r ).unsafe_value() ); } } @@ -1289,7 +1286,7 @@ result operator&( result const& r, F&& f ) } else { - compat::invoke( std::forward( f ), *r ); + compat::invoke( std::forward( f ), r.unsafe_value() ); return {}; } } @@ -1306,7 +1303,7 @@ result operator&( result&& r, F&& f ) } else { - compat::invoke( std::forward( f ), *std::move( r ) ); + compat::invoke( std::forward( f ), std::move( r ).unsafe_value() ); return {}; } } @@ -1360,7 +1357,7 @@ U operator&( result& r, F&& f ) } else { - return compat::invoke( std::forward( f ), *r ); + return compat::invoke( std::forward( f ), r.unsafe_value() ); } } @@ -1377,7 +1374,7 @@ U operator&( result const& r, F&& f ) } else { - return compat::invoke( std::forward( f ), *r ); + return compat::invoke( std::forward( f ), r.unsafe_value() ); } } @@ -1394,7 +1391,7 @@ U operator&( result&& r, F&& f ) } else { - return compat::invoke( std::forward( f ), *std::move( r ) ); + return compat::invoke( std::forward( f ), std::move( r ).unsafe_value() ); } } @@ -1428,7 +1425,7 @@ result& operator&=( result& r, F&& f ) { if( r ) { - r = std::forward( f )( *std::move( r ) ); + r = std::forward( f )( std::move( r ).unsafe_value() ); } return r; @@ -1460,7 +1457,7 @@ result& operator&=( result& r, F&& f ) { if( r ) { - r = std::forward( f )( *std::move( r ) ); + r = std::forward( f )( std::move( r ).unsafe_value() ); } return r; diff --git a/test/result_and_eq_fn1r.cpp b/test/result_and_eq_fn1r.cpp index 703e4dc..535aa76 100644 --- a/test/result_and_eq_fn1r.cpp +++ b/test/result_and_eq_fn1r.cpp @@ -96,7 +96,7 @@ int main() result r( 1 ); r &= fi; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 3 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value(), 3 ); r &= fi2; BOOST_TEST( r.has_error() ); @@ -109,7 +109,7 @@ int main() result r( in_place_value, 1 ); r &= fy; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 3 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value().v_, 3 ); r &= fy2; BOOST_TEST( r.has_error() ); @@ -123,7 +123,7 @@ int main() result r( x1 ); r &= fri; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &*fri( x1 ) ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &r.unsafe_value(), &fri( x1 ).unsafe_value() ); r &= fri2; BOOST_TEST( r.has_error() ); diff --git a/test/result_and_fn1r.cpp b/test/result_and_fn1r.cpp index beaf858..1cfeca8 100644 --- a/test/result_and_fn1r.cpp +++ b/test/result_and_fn1r.cpp @@ -112,7 +112,7 @@ int main() { result r2 = r & fi; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 3 ); } { @@ -131,7 +131,7 @@ int main() { result r2 = r & fi; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 3 ); } { @@ -147,7 +147,7 @@ int main() { result r2 = result( 1 ) & fi; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 3 ); } { @@ -216,7 +216,7 @@ int main() { result r2 = result( in_place_value, 1 ) & fy; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2->v_, 3 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value().v_, 3 ); } { @@ -255,7 +255,7 @@ int main() { result r2 = r & fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 3 ); } { @@ -275,7 +275,7 @@ int main() { result r2 = r & fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 3 ); } { @@ -293,7 +293,7 @@ int main() int x1 = 1; result r2 = result( x1 ) & fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 3 ); } { @@ -368,7 +368,7 @@ int main() { result r2 = r & fk; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 7 ); } { @@ -392,7 +392,7 @@ int main() { result r2 = r & fk; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 7 ); } { @@ -413,7 +413,7 @@ int main() { result r2 = result() & fk; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 7 ); } { diff --git a/test/result_and_mfn1r.cpp b/test/result_and_mfn1r.cpp index 46a259e..c98e2a5 100644 --- a/test/result_and_mfn1r.cpp +++ b/test/result_and_mfn1r.cpp @@ -41,7 +41,7 @@ int main() { result r2 = r & &X::f; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 1 ); } { @@ -51,12 +51,12 @@ int main() { result r2 = r & &X::g; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &r->v_ ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &r.unsafe_value().v_ ); } { result r2 = r & &X::g2; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &r->v_ ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &r.unsafe_value().v_ ); } { @@ -75,7 +75,7 @@ int main() { result r2 = r & &X::f; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 1 ); } { @@ -85,7 +85,7 @@ int main() { result r2 = r & &X::g2; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &r->v_ ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &r.unsafe_value().v_ ); } { @@ -102,7 +102,7 @@ int main() { { result r2 = result( 1 ) & &X::f; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.unsafe_value(), 1 ); } { diff --git a/test/result_convert_construct.cpp b/test/result_convert_construct.cpp index 39bbcb6..4bcdcea 100644 --- a/test/result_convert_construct.cpp +++ b/test/result_convert_construct.cpp @@ -126,7 +126,7 @@ int main() result r( "test" ); result r2 = r; - BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, std::string( "test" ) ); + BOOST_TEST( r2 ) && BOOST_TEST_EQ( r2.unsafe_value(), std::string( "test" ) ); BOOST_TEST_EQ( X::instances, 0 ); } @@ -136,7 +136,7 @@ int main() result const r( "test" ); result r2 = r; - BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, std::string( "test" ) ); + BOOST_TEST( r2 ) && BOOST_TEST_EQ( r2.unsafe_value(), std::string( "test" ) ); BOOST_TEST_EQ( X::instances, 0 ); } @@ -145,7 +145,7 @@ int main() { result r2 = result( "test" ); - BOOST_TEST( r2 ) && BOOST_TEST_EQ( *r2, std::string( "test" ) ); + BOOST_TEST( r2 ) && BOOST_TEST_EQ( r2.unsafe_value(), std::string( "test" ) ); BOOST_TEST_EQ( X::instances, 0 ); } diff --git a/test/result_emplace.cpp b/test/result_emplace.cpp index 784d924..77e1b14 100644 --- a/test/result_emplace.cpp +++ b/test/result_emplace.cpp @@ -42,6 +42,15 @@ struct Y int Y::instances = 0; +struct E +{ +}; + +BOOST_NORETURN void throw_exception_from_error( Y const &, boost::source_location const& ) +{ + throw E(); +} + int main() { { diff --git a/test/result_or_eq_fn0r.cpp b/test/result_or_eq_fn0r.cpp index b333081..f6b3c47 100644 --- a/test/result_or_eq_fn0r.cpp +++ b/test/result_or_eq_fn0r.cpp @@ -87,11 +87,11 @@ int main() r |= fi; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value(), 1 ); r |= fi2; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value(), 1 ); } { @@ -103,7 +103,7 @@ int main() r |= fi; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 2 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value(), 2 ); } { @@ -111,11 +111,11 @@ int main() r |= fy; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 1 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value().v_, 1 ); r |= fy2; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 1 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value().v_, 1 ); } { @@ -127,7 +127,7 @@ int main() r |= fy; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 2 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value().v_, 2 ); } { @@ -137,11 +137,11 @@ int main() r |= fri; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x1 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &r.unsafe_value(), &x1 ); r |= fri2; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x1 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &r.unsafe_value(), &x1 ); } { @@ -153,7 +153,7 @@ int main() r |= fri; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &*fri() ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &r.unsafe_value(), &fri().unsafe_value() ); } return boost::report_errors(); diff --git a/test/result_or_eq_fn0v.cpp b/test/result_or_eq_fn0v.cpp index 25897d0..bfe2109 100644 --- a/test/result_or_eq_fn0v.cpp +++ b/test/result_or_eq_fn0v.cpp @@ -74,7 +74,7 @@ int main() r |= f; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 2 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value(), 2 ); } { @@ -90,7 +90,7 @@ int main() r |= g; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 2 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value().v_, 2 ); } { @@ -108,7 +108,7 @@ int main() r |= h; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &h() ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &r.unsafe_value(), &h() ); } return boost::report_errors(); diff --git a/test/result_or_eq_value.cpp b/test/result_or_eq_value.cpp index ac2c751..c6e7211 100644 --- a/test/result_or_eq_value.cpp +++ b/test/result_or_eq_value.cpp @@ -58,7 +58,7 @@ int main() r |= 2; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 2 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value(), 2 ); } { @@ -74,7 +74,7 @@ int main() r |= X{2}; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 2 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r.unsafe_value().v_, 2 ); } { @@ -85,7 +85,7 @@ int main() r |= x2; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x1 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &r.unsafe_value(), &x1 ); } { @@ -95,7 +95,7 @@ int main() r |= x2; - BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x2 ); + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &r.unsafe_value(), &x2 ); } return boost::report_errors(); diff --git a/test/result_or_fn0r.cpp b/test/result_or_fn0r.cpp index f8e4191..f678d18 100644 --- a/test/result_or_fn0r.cpp +++ b/test/result_or_fn0r.cpp @@ -196,7 +196,7 @@ int main() auto r2 = r | fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &x1 ); } { @@ -206,7 +206,7 @@ int main() auto r2 = r | fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &x1 ); } { @@ -214,7 +214,7 @@ int main() auto r2 = result( x1 ) | fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &x1 ); } { @@ -224,7 +224,7 @@ int main() auto r2 = r | fri2; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &x1 ); } { @@ -234,7 +234,7 @@ int main() auto r2 = r | fri2; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &x1 ); } { @@ -242,7 +242,7 @@ int main() auto r2 = result( x1 ) | fri2; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &x1 ); } { @@ -250,7 +250,7 @@ int main() auto r2 = r | fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &*fri() ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &fri().unsafe_value() ); } { @@ -258,13 +258,13 @@ int main() auto r2 = r | fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &*fri() ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &fri().unsafe_value() ); } { auto r2 = result( in_place_error ) | fri; - BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &*fri() ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &r2.unsafe_value(), &fri().unsafe_value() ); } { diff --git a/test/result_value_access.cpp b/test/result_value_access.cpp index 8da97b4..66899a1 100644 --- a/test/result_value_access.cpp +++ b/test/result_value_access.cpp @@ -138,7 +138,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -154,7 +155,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -168,7 +170,8 @@ int main() BOOST_TEST_THROWS( result( ec ).value(), system_error ); - BOOST_TEST_EQ( result( ec ).operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *result( ec ), system_error ); + BOOST_TEST_THROWS( result( ec ).operator->(), system_error ); } { @@ -184,7 +187,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::system_error ); + BOOST_TEST_THROWS( r.operator->(), std::system_error ); } { @@ -198,7 +202,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -212,7 +217,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::system_error ); + BOOST_TEST_THROWS( r.operator->(), std::system_error ); } { @@ -229,7 +235,8 @@ int main() BOOST_TEST_THROWS( r.value(), E2 ); #endif - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, E2 ); + BOOST_TEST_THROWS( r.operator->(), E2 ); } { @@ -243,7 +250,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::bad_exception ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::bad_exception ); + BOOST_TEST_THROWS( r.operator->(), std::bad_exception ); } { @@ -303,7 +311,8 @@ int main() BOOST_TEST_THROWS( r.value(), E ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, E ); + BOOST_TEST_THROWS( r.operator->(), E ); } { @@ -319,7 +328,8 @@ int main() BOOST_TEST_THROWS( r.value(), E ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, E ); + BOOST_TEST_THROWS( r.operator->(), E ); } { @@ -333,7 +343,8 @@ int main() BOOST_TEST_THROWS( (result( ec ).value()), E ); - BOOST_TEST_EQ( (result( ec ).operator->()), static_cast(0) ); + BOOST_TEST_THROWS( *(result( ec )), E ); + BOOST_TEST_THROWS( (result( ec )).operator->(), E ); } // @@ -349,6 +360,9 @@ int main() BOOST_TEST_NO_THROW( r.value() ); + BOOST_TEST_NO_THROW( *r ); + BOOST_TEST_NO_THROW( r.operator->() ); + BOOST_TEST( r.operator->() != 0 ); } @@ -363,6 +377,9 @@ int main() BOOST_TEST_NO_THROW( r.value() ); + BOOST_TEST_NO_THROW( *r ); + BOOST_TEST_NO_THROW( r.operator->() ); + BOOST_TEST( r.operator->() != 0 ); } @@ -375,6 +392,9 @@ int main() BOOST_TEST_NO_THROW( result().value() ); + BOOST_TEST_NO_THROW( *result() ); + BOOST_TEST_NO_THROW( result().operator->() ); + BOOST_TEST( result().operator->() != 0 ); } @@ -391,7 +411,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -407,7 +428,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -421,7 +443,8 @@ int main() BOOST_TEST_THROWS( result( ec ).value(), system_error ); - BOOST_TEST_EQ( result( ec ).operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *result( ec ), system_error ); + BOOST_TEST_THROWS( result( ec ).operator->(), system_error ); } { @@ -437,7 +460,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::system_error ); + BOOST_TEST_THROWS( r.operator->(), std::system_error ); } { @@ -451,7 +475,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -465,7 +490,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::system_error ); + BOOST_TEST_THROWS( r.operator->(), std::system_error ); } { @@ -482,7 +508,8 @@ int main() BOOST_TEST_THROWS( r.value(), E2 ); #endif - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, E2 ); + BOOST_TEST_THROWS( r.operator->(), E2 ); } { @@ -496,7 +523,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::bad_exception ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::bad_exception ); + BOOST_TEST_THROWS( r.operator->(), std::bad_exception ); } // @@ -563,7 +591,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -579,7 +608,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -593,7 +623,8 @@ int main() BOOST_TEST_THROWS( result( ec ).value(), system_error ); - BOOST_TEST_EQ( result( ec ).operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *result( ec ), system_error ); + BOOST_TEST_THROWS( result( ec ).operator->(), system_error ); } { @@ -609,7 +640,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::system_error ); + BOOST_TEST_THROWS( r.operator->(), std::system_error ); } { @@ -623,7 +655,8 @@ int main() BOOST_TEST_THROWS( r.value(), system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, system_error ); + BOOST_TEST_THROWS( r.operator->(), system_error ); } { @@ -637,7 +670,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::system_error ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::system_error ); + BOOST_TEST_THROWS( r.operator->(), std::system_error ); } { @@ -654,7 +688,8 @@ int main() BOOST_TEST_THROWS( r.value(), E2 ); #endif - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, E2 ); + BOOST_TEST_THROWS( r.operator->(), E2 ); } { @@ -668,7 +703,8 @@ int main() BOOST_TEST_THROWS( r.value(), std::bad_exception ); - BOOST_TEST_EQ( r.operator->(), static_cast(0) ); + BOOST_TEST_THROWS( *r, std::bad_exception ); + BOOST_TEST_THROWS( r.operator->(), std::bad_exception ); } // diff --git a/test/result_value_construct.cpp b/test/result_value_construct.cpp index ff2cae4..1ff5680 100644 --- a/test/result_value_construct.cpp +++ b/test/result_value_construct.cpp @@ -27,6 +27,15 @@ struct X int X::instances = 0; +struct E +{ +}; + +BOOST_NORETURN void throw_exception_from_error( X const &, boost::source_location const& ) +{ + throw E(); +} + int main() { { @@ -53,7 +62,7 @@ int main() BOOST_TEST( r.has_value() ); BOOST_TEST( !r.has_error() ); - BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST_EQ( r.unsafe_value(), 1 ); } BOOST_TEST_EQ( X::instances, 0 ); diff --git a/test/result_value_construct2.cpp b/test/result_value_construct2.cpp index b3d92a2..eb8584b 100644 --- a/test/result_value_construct2.cpp +++ b/test/result_value_construct2.cpp @@ -74,6 +74,15 @@ result fw0() return {}; } +struct E2 +{ +}; + +BOOST_NORETURN void throw_exception_from_error( E const &, boost::source_location const& ) +{ + throw E2(); +} + int main() { { diff --git a/test/result_value_construct3.cpp b/test/result_value_construct3.cpp index ebcca2a..841e846 100644 --- a/test/result_value_construct3.cpp +++ b/test/result_value_construct3.cpp @@ -26,6 +26,15 @@ struct X int X::instances = 0; +struct E +{ +}; + +BOOST_NORETURN void throw_exception_from_error( X const &, boost::source_location const& ) +{ + throw E(); +} + int main() { { @@ -45,7 +54,7 @@ int main() BOOST_TEST( r.has_value() ); BOOST_TEST( !r.has_error() ); - BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST_EQ( r.unsafe_value(), 1 ); } BOOST_TEST_EQ( X::instances, 0 ); @@ -135,7 +144,7 @@ int main() BOOST_TEST( r.has_value() ); BOOST_TEST( !r.has_error() ); - BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST_EQ( r.unsafe_value(), 1 ); } return boost::report_errors(); diff --git a/test/result_value_construct6.cpp b/test/result_value_construct6.cpp index f9dd3fc..18d25c9 100644 --- a/test/result_value_construct6.cpp +++ b/test/result_value_construct6.cpp @@ -24,6 +24,15 @@ struct X int X::instances = 0; +struct E +{ +}; + +BOOST_NORETURN void throw_exception_from_error( X const &, boost::source_location const& ) +{ + throw E(); +} + int main() { { @@ -53,7 +62,7 @@ int main() BOOST_TEST( r.has_value() ); BOOST_TEST( !r.has_error() ); - BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST_EQ( r.unsafe_value(), 1 ); } BOOST_TEST_EQ( X::instances, 0 ); diff --git a/test/result_value_construct7.cpp b/test/result_value_construct7.cpp index 97e5343..b0e3ced 100644 --- a/test/result_value_construct7.cpp +++ b/test/result_value_construct7.cpp @@ -24,6 +24,15 @@ struct X int X::instances = 0; +struct E +{ +}; + +BOOST_NORETURN void throw_exception_from_error( X const &, boost::source_location const& ) +{ + throw E(); +} + int main() { { @@ -73,7 +82,7 @@ int main() BOOST_TEST( r.has_value() ); BOOST_TEST( !r.has_error() ); - BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST_EQ( r.unsafe_value(), 1 ); } { @@ -83,7 +92,7 @@ int main() BOOST_TEST( r.has_value() ); BOOST_TEST( !r.has_error() ); - BOOST_TEST_EQ( *r, 1 ); + BOOST_TEST_EQ( r.unsafe_value(), 1 ); } BOOST_TEST_EQ( X::instances, 0 );