diff --git a/include/boost/leaf/handle_errors.hpp b/include/boost/leaf/handle_errors.hpp index f40cf8d9..3e36f19e 100644 --- a/include/boost/leaf/handle_errors.hpp +++ b/include/boost/leaf/handle_errors.hpp @@ -932,9 +932,7 @@ try_handle_some( TryBlock && try_block, H && ... h ) auto active_context = activate_context(ctx); if( auto r = leaf_detail::try_catch_(ctx, std::forward(try_block), std::forward(h)...) ) return r; - else if( !ctx.is_active() ) - return r; - else + else if( ctx.is_active() ) { leaf_detail::unload_result(&r); error_id id = r.error(); @@ -949,6 +947,11 @@ try_handle_some( TryBlock && try_block, H && ... h ) ctx.unload(rr.error()); return rr; } + else + { + ctx.unload(r.error()); + return r; + } } template diff --git a/test/handle_some_test.cpp b/test/handle_some_test.cpp index 6f79ed62..1950d381 100644 --- a/test/handle_some_test.cpp +++ b/test/handle_some_test.cpp @@ -285,7 +285,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -324,7 +324,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -364,7 +364,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -403,7 +403,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -441,7 +441,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -479,7 +479,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -517,7 +517,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -555,7 +555,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -594,7 +594,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -634,7 +634,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -673,7 +673,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -711,7 +711,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -749,7 +749,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -787,7 +787,7 @@ int main() BOOST_TEST_EQ(c, 0); c = 2; }, - [&c]() + [&c] { BOOST_TEST_EQ(c, 0); c = 3; @@ -1014,6 +1014,40 @@ int main() } #endif +#if BOOST_LEAF_CFG_STD_SYSTEM_ERROR + // int, try_handle_some (failure, initially not matched), match cond_x (wrapped std::error_code) + { + int r = leaf::try_handle_all( + [] + { + leaf::result r1 = leaf::try_handle_some( + []() -> leaf::result + { + BOOST_LEAF_AUTO(answer, f_errc_wrapped(errc_a::a0)); + return answer; + }, + []( leaf::match_value, cond_x::x11> ) + { + return 1; + } ); + BOOST_TEST(!r1); + return r1; + }, + []( leaf::match_value, cond_x::x00> ec, info<1> const & x, info<2> y ) + { + BOOST_TEST_EQ(ec.matched.value, make_error_code(errc_a::a0)); + BOOST_TEST_EQ(x.value, 1); + BOOST_TEST_EQ(y.value, 2); + return 2; + }, + [] + { + return 3; + } ); + BOOST_TEST_EQ(r, 2); + } +#endif + // int, try_handle_some (failure, initially not matched), match enum (single enum value) { int r = leaf::try_handle_all( @@ -1174,6 +1208,74 @@ int main() BOOST_TEST_EQ(r, 1); } +#if BOOST_LEAF_CFG_STD_SYSTEM_ERROR + // int, try_handle_some (failure, initially matched), match cond_x (single enum value) + { + int r = leaf::try_handle_all( + [] + { + leaf::result r1 = leaf::try_handle_some( + []() -> leaf::result + { + BOOST_LEAF_AUTO(answer, f_errc(errc_a::a0)); + return answer; + }, + []( leaf::match, cond_x::x00> ec, info<1> const & x, info<2> y ) + { + BOOST_TEST_EQ(ec.matched, make_error_code(errc_a::a0)); + BOOST_TEST_EQ(x.value, 1); + BOOST_TEST_EQ(y.value, 2); + return 1; + } ); + BOOST_TEST(r1); + return r1; + }, + []( leaf::match, cond_x::x11> ) + { + return 2; + }, + [] + { + return 3; + } ); + BOOST_TEST_EQ(r, 1); + } +#endif + +#if BOOST_LEAF_CFG_STD_SYSTEM_ERROR + // int, try_handle_some (failure, initially matched), match cond_x (wrapped std::error_code) + { + int r = leaf::try_handle_all( + [] + { + leaf::result r1 = leaf::try_handle_some( + []() -> leaf::result + { + BOOST_LEAF_AUTO(answer, f_errc_wrapped(errc_a::a0)); + return answer; + }, + []( leaf::match_value, cond_x::x00> ec, info<1> const & x, info<2> y ) + { + BOOST_TEST_EQ(ec.matched.value, make_error_code(errc_a::a0)); + BOOST_TEST_EQ(x.value, 1); + BOOST_TEST_EQ(y.value, 2); + return 1; + } ); + BOOST_TEST(r1); + return r1; + }, + []( leaf::match_value, cond_x::x11> ) + { + return 2; + }, + [] + { + return 3; + } ); + BOOST_TEST_EQ(r, 1); + } +#endif + // int, try_handle_some (failure, initially matched), match enum (single enum value) { int r = leaf::try_handle_all( @@ -1304,11 +1406,11 @@ int main() ////////////////////////////////////// - // void, no exception caught, error handled + // no exception caught, error handled { int handle_some_handler_called = 0; - leaf::result r = leaf::try_handle_some( - []() -> leaf::result + leaf::result r = leaf::try_handle_some( + []() -> leaf::result { return leaf::new_error( info<0>{1} ); }, @@ -1316,66 +1418,96 @@ int main() { BOOST_TEST_EQ(x.value, 1); ++handle_some_handler_called; + return 1; } ); - BOOST_TEST(r); + BOOST_TEST_EQ(r.value(), 1); BOOST_TEST_EQ(handle_some_handler_called, 1); } - // void, no exception caught, error not handled + // no exception caught, error not handled { int handle_some_handler_called = 0; - leaf::result r = leaf::try_handle_some( - []() -> leaf::result + int r = leaf::try_handle_all( + [&] { - return leaf::new_error( info<0>{1} ); + leaf::result r1 = leaf::try_handle_some( + []() -> leaf::result + { + return leaf::new_error( info<0>{1} ); + }, + [&]( leaf::error_info const & e, info<0> & x ) -> leaf::result + { + BOOST_TEST_EQ(x.value, 1); + ++handle_some_handler_called; + return e.error(); + } ); + BOOST_TEST(!r1); + BOOST_TEST_EQ(handle_some_handler_called, 1); + return r1; }, - [&]( leaf::error_info const & e, info<0> & x ) -> leaf::result + [](info<0> & x) { BOOST_TEST_EQ(x.value, 1); - ++handle_some_handler_called; - return e.error(); - } ); - BOOST_TEST(!r); - BOOST_TEST_EQ(handle_some_handler_called, 1); + return 1; + }, + [] + { + return 2; + }); } #ifndef BOOST_LEAF_NO_EXCEPTIONS - // void, exception caught, error handled + // exception caught, error handled { int handle_some_handler_called = 0; - leaf::result r = leaf::try_handle_some( - []() -> leaf::result + leaf::result r = leaf::try_handle_some( + []() -> leaf::result { BOOST_LEAF_THROW_EXCEPTION( info<0>{1} ); }, - [&]( info<0> & x ) -> leaf::result + [&]( info<0> & x ) -> leaf::result { BOOST_TEST_EQ(x.value, 1); ++handle_some_handler_called; - return { }; + return 1; } ); - BOOST_TEST(r); + BOOST_TEST_EQ(r.value(), 1); BOOST_TEST_EQ(handle_some_handler_called, 1); } #endif #ifndef BOOST_LEAF_NO_EXCEPTIONS - // void, exception caught, error not handled - { + // exception caught, error not handled + { int handle_some_handler_called = 0; - leaf::result r = leaf::try_handle_some( - []() -> leaf::result + int r = leaf::try_handle_all( + [&] { - BOOST_LEAF_THROW_EXCEPTION( info<0>{1} ); + leaf::result r = leaf::try_handle_some( + []() -> leaf::result + { + BOOST_LEAF_THROW_EXCEPTION( info<0>{1} ); + }, + [&]( leaf::error_info const & e, info<0> & x ) -> leaf::result + { + BOOST_TEST_EQ(x.value, 1); + ++handle_some_handler_called; + return e.error(); + } ); + BOOST_TEST(!r); + BOOST_TEST_EQ(handle_some_handler_called, 1); + return r; }, - [&]( leaf::error_info const & e, info<0> & x ) -> leaf::result + []( info<0> & x ) { BOOST_TEST_EQ(x.value, 1); - ++handle_some_handler_called; - return e.error(); - } ); - BOOST_TEST(!r); - BOOST_TEST_EQ(handle_some_handler_called, 1); + return 1; + }, + [] + { + return 2; + }); + BOOST_TEST_EQ(r, 1); } #endif