diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index 539113c..990e0b4 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -919,9 +919,10 @@ template struct is_result< result >: std::true_type {}; // result | value template::value>::type + class En = typename std::enable_if::type>::value>::type > -T operator|( result const& r, U&& u ) +typename std::decay::type +operator|( result const& r, U&& u ) { if( r ) { @@ -934,9 +935,10 @@ T operator|( result const& r, U&& u ) } template::value>::type + class En = typename std::enable_if::type>::value>::type > -T operator|( result&& r, U&& u ) +typename std::decay::type +operator|( result&& r, U&& u ) { if( r ) { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7bda2f4..29ad844 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -165,8 +165,6 @@ boost_test(TYPE run SOURCES result_value_construct6.cpp) boost_test(TYPE run SOURCES result_value_construct7.cpp) boost_test(TYPE run SOURCES result_error_construct5.cpp) boost_test(TYPE run SOURCES result_or_value.cpp) -boost_test(TYPE compile-fail SOURCES result_or_value_fail.cpp) -boost_test(TYPE compile-fail SOURCES result_or_value_fail2.cpp) boost_test(TYPE run SOURCES result_or_fn0v.cpp) boost_test(TYPE run SOURCES result_or_fn0r.cpp) boost_test(TYPE run SOURCES result_and_fn1v.cpp) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 9d9a491..309fe02 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -198,8 +198,6 @@ run result_value_construct6.cpp ; run result_value_construct7.cpp ; run result_error_construct5.cpp ; run result_or_value.cpp ; -compile-fail result_or_value_fail.cpp ; -compile-fail result_or_value_fail2.cpp ; run result_or_fn0v.cpp ; run result_or_fn0r.cpp ; run result_and_fn1v.cpp ; diff --git a/test/result_or_fn0r.cpp b/test/result_or_fn0r.cpp index 18ed7cd..f8e4191 100644 --- a/test/result_or_fn0r.cpp +++ b/test/result_or_fn0r.cpp @@ -191,120 +191,102 @@ int main() { int x1 = 1; - int x3 = 3; result r( x1 ); - int& x = r | fri | x3; + auto r2 = r | fri; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); } { int x1 = 1; - int x3 = 3; result const r( x1 ); - int& x = r | fri | x3; + auto r2 = r | fri; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); } { int x1 = 1; - int x3 = 3; - int& x = result( x1 ) | fri | x3; + auto r2 = result( x1 ) | fri; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); } { int x1 = 1; - int x3 = 3; result r( x1 ); - int& x = r | fri2 | x3; + auto r2 = r | fri2; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); } { int x1 = 1; - int x3 = 3; result const r( x1 ); - int& x = r | fri2 | x3; + auto r2 = r | fri2; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); } { int x1 = 1; - int x3 = 3; - int& x = result( x1 ) | fri2 | x3; + auto r2 = result( x1 ) | fri2; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &x1 ); } { - int x3 = 3; - result r( in_place_error ); - int& x = r | fri | x3; + auto r2 = r | fri; - BOOST_TEST_EQ( &x, &*fri() ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &*fri() ); } { - int x3 = 3; - result const r( in_place_error ); - int& x = r | fri | x3; + auto r2 = r | fri; - BOOST_TEST_EQ( &x, &*fri() ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &*fri() ); } { - int x3 = 3; + auto r2 = result( in_place_error ) | fri; - int& x = result( in_place_error ) | fri | x3; - - BOOST_TEST_EQ( &x, &*fri() ); + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( &*r2, &*fri() ); } { - int x3 = 3; - result r( in_place_error ); - int& x = r | fri2 | x3; + auto r2 = r | fri2; - BOOST_TEST_EQ( &x, &x3 ); + BOOST_TEST( r2.has_error() ); } { - int x3 = 3; - result const r( in_place_error ); - int& x = r | fri2 | x3; + auto r2 = r | fri2; - BOOST_TEST_EQ( &x, &x3 ); + BOOST_TEST( r2.has_error() ); } { - int x3 = 3; + auto r2 = result( in_place_error ) | fri2; - int& x = result( in_place_error ) | fri2 | x3; - - BOOST_TEST_EQ( &x, &x3 ); + BOOST_TEST( r2.has_error() ); } { diff --git a/test/result_or_value.cpp b/test/result_or_value.cpp index bf7f945..2466edc 100644 --- a/test/result_or_value.cpp +++ b/test/result_or_value.cpp @@ -4,6 +4,8 @@ #include #include +#include +#include using namespace boost::system; @@ -110,9 +112,22 @@ int main() result r( x1 ); - int& x = r | x2; + { + auto&& x3 = r | x2; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x3, x1 ); + BOOST_TEST_NE( &x3, &x1 ); + } + + { + auto&& x4 = r | 3; + + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x4, x1 ); + } } { @@ -121,18 +136,44 @@ int main() result const r( x1 ); - int& x = r | x2; + { + auto&& x3 = r | x2; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x3, x1 ); + BOOST_TEST_NE( &x3, &x1 ); + } + + { + auto&& x4 = r | 3; + + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x4, x1 ); + } } { int x1 = 1; int x2 = 2; - int& x = result( x1 ) | x2; + { + auto&& x3 = result( x1 ) | x2; - BOOST_TEST_EQ( &x, &x1 ); + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x3, x1 ); + BOOST_TEST_NE( &x3, &x1 ); + } + + { + auto&& x4 = result( x1 ) | 3; + + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x4, x1 ); + } } { @@ -140,9 +181,22 @@ int main() result r( in_place_error ); - int& x = r | x2; + { + auto&& x3 = r | x2; - BOOST_TEST_EQ( &x, &x2 ); + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x3, x2 ); + BOOST_TEST_NE( &x3, &x2 ); + } + + { + auto&& x4 = r | 3; + + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x4, 3 ); + } } { @@ -150,17 +204,43 @@ int main() result const r( in_place_error ); - int& x = r | x2; + { + auto&& x3 = r | x2; - BOOST_TEST_EQ( &x, &x2 ); + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x3, x2 ); + BOOST_TEST_NE( &x3, &x2 ); + } + + { + auto&& x4 = r | 3; + + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x4, 3 ); + } } { int x2 = 2; - int& x = result( in_place_error ) | x2; + { + auto&& x3 = result( in_place_error ) | x2; - BOOST_TEST_EQ( &x, &x2 ); + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x3, x2 ); + BOOST_TEST_NE( &x3, &x2 ); + } + + { + auto&& x4 = result( in_place_error ) | 3; + + BOOST_TEST_TRAIT_FALSE(( std::is_lvalue_reference )); + + BOOST_TEST_EQ( x4, 3 ); + } } return boost::report_errors(); diff --git a/test/result_or_value_fail.cpp b/test/result_or_value_fail.cpp deleted file mode 100644 index 1e6a5cd..0000000 --- a/test/result_or_value_fail.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017, 2021, 2022 Peter Dimov. -// Distributed under the Boost Software License, Version 1.0. -// https://www.boost.org/LICENSE_1_0.txt - -#include - -using namespace boost::system; - -int main() -{ - int x = 1; - result r( x ); - r | 2; -} diff --git a/test/result_or_value_fail2.cpp b/test/result_or_value_fail2.cpp deleted file mode 100644 index fca8fa1..0000000 --- a/test/result_or_value_fail2.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017, 2021, 2022 Peter Dimov. -// Distributed under the Boost Software License, Version 1.0. -// https://www.boost.org/LICENSE_1_0.txt - -#include - -using namespace boost::system; - -int main() -{ - int x = 1; - result( x ) | 2; -}