// Copyright (c) 2018 Emil Dotchevski // Copyright (c) 2018 Second Spectrum, Inc. // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include "boost/core/lightweight_test.hpp" namespace leaf = boost::leaf; struct val { static int id_count; static int count; int id; val(): id(++id_count) { ++count; } val( val const & x ): id(x.id) { ++count; } val( val && x ): id(x.id) { ++count; } ~val() { --count; } friend bool operator==( val const & a, val const & b ) { return a.id==b.id; } }; int val::count = 0; int val::id_count = 0; struct err { static int count; err() { ++count; } err( err const & ) { ++count; } err( err && ) { ++count; } ~err() { --count; } }; int err::count = 0; struct e_err { err value; }; bool eq_value( leaf::result & r1, leaf::result & r2 ) { leaf::result const & cr1 = r1; leaf::result const & cr2 = r2; return r1.value()==r2.value() && cr1.value()==cr2.value() && *r1==*r2 && *cr1==*cr2; } int main() { using leaf::leaf_detail::static_store; using leaf::capture_result; { // value default -> copy leaf::result r1; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> copy leaf::result r1 = val(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> copy val v; leaf::result r1 = v; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); leaf::result r2 = r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==3); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value default -> move leaf::result r1; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> move leaf::result r1 = val(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> move val v; leaf::result r1 = v; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); leaf::result r2 = std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==3); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value default -> assign-copy leaf::result r1; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> assign-copy leaf::result r1 = val(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> assign-copy val v; leaf::result r1 = v; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); leaf::result r2; r2=r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==3); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value default -> assign-move leaf::result r1; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> assign-move leaf::result r1 = val(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> assign-move val v; leaf::result r1 = v; BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==3); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value default -> capture -> copy leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> capture -> copy leaf::result r1 = capture_result( [ ]{ return leaf::result(val()); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> capture -> copy leaf::result r1 = capture_result( [ ]{ val v; return leaf::result(v); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value default -> capture -> move leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> capture -> move leaf::result r1 = capture_result( [ ]{ return leaf::result(val()); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> capture -> move leaf::result r1 = capture_result( [ ]{ val v; return leaf::result(v); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value default -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ return leaf::result(val()); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ val v; return leaf::result(v); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=r1; BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); BOOST_TEST(eq_value(r1,r2)); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value default -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value move -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ return leaf::result(val()); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // value copy -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ val v; return leaf::result(v); } )(); BOOST_TEST(r1); BOOST_TEST(err::count==0); BOOST_TEST(val::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); BOOST_TEST(err::count==0); BOOST_TEST(val::count==2); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); // ^^ value ^^ // vv error vv { // error move -> copy static_store exp; exp.set_reset(true); leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> copy static_store exp; exp.set_reset(true); leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error move -> move static_store exp; exp.set_reset(true); leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> move static_store exp; leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error move -> assign copy static_store exp; leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> assign copy static_store exp; leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error move -> assign move static_store exp; leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); leaf::error const e = r2.error(); exp.handle_error(leaf::error_info(e),[ ]{ }); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> assign move static_store exp; leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error move -> capture -> copy leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> capture -> copy leaf::result r1 = capture_result( [ ] { leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error move -> capture -> move leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> capture -> move leaf::result r1 = capture_result( [ ]{ leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error move -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error move -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); { // error copy -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); BOOST_TEST(val::count==0); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); BOOST_TEST(val::count==0); // ^^ result ^^ ///////////////////////////////////////////////////////////// // vv result vv { // void default -> copy leaf::result r1; BOOST_TEST(r1); leaf::result r2 = r1; BOOST_TEST(r2); } { // void default -> move leaf::result r1; BOOST_TEST(r1); leaf::result r2 = std::move(r1); BOOST_TEST(r2); } { // void default -> assign-copy leaf::result r1; BOOST_TEST(r1); leaf::result r2; r2=r1; BOOST_TEST(r2); } { // void default -> assign-move leaf::result r1; BOOST_TEST(r1); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); } { // void default -> capture -> copy leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); leaf::result r2 = r1; BOOST_TEST(r2); } { // void default -> capture -> move leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); leaf::result r2 = std::move(r1); BOOST_TEST(r2); } { // void default -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); leaf::result r2; r2=r1; BOOST_TEST(r2); } { // void default -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ return leaf::result(); } )(); BOOST_TEST(r1); leaf::result r2; r2=std::move(r1); BOOST_TEST(r2); } // ^^ void default ^^ // vv void error vv { // void error move -> copy static_store exp; exp.set_reset(true); leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error copy -> copy static_store exp; exp.set_reset(true); leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error move -> move static_store exp; exp.set_reset(true); leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error copy -> move static_store exp; leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error move -> assign copy static_store exp; leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error copy -> assign copy static_store exp; leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error move -> assign move static_store exp; leaf::result r1 = leaf::new_error( e_err { } ); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); leaf::error const e = r2.error(); exp.handle_error(leaf::error_info(e),[ ]{ }); BOOST_TEST(err::count==1); } BOOST_TEST(err::count==0); { // void error copy -> assign move static_store exp; leaf::error e = leaf::new_error( e_err{ } ); leaf::result r1 = e; BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error move -> capture -> copy leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error copy -> capture -> copy leaf::result r1 = capture_result( [ ] { leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error move -> capture -> move leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error copy -> capture -> move leaf::result r1 = capture_result( [ ]{ leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2 = std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error move -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error copy -> capture -> assign-copy leaf::result r1 = capture_result( [ ]{ leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=r1; BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error move -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ return leaf::result( leaf::new_error( e_err { } ) ); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); { // void error copy -> capture -> assign-move leaf::result r1 = capture_result( [ ]{ leaf::error e = leaf::new_error( e_err{ } ); return leaf::result(e); } )(); BOOST_TEST(!r1); BOOST_TEST(err::count==1); leaf::result r2; r2=std::move(r1); BOOST_TEST(!r2); BOOST_TEST(r1.error()==r2.error()); } BOOST_TEST(err::count==0); return boost::report_errors(); }