1// Copyright 2023 Peter Dimov.
2// Distributed under the Boost Software License, Version 1.0.
3// https://www.boost.org/LICENSE_1_0.txt
4
5#include <boost/system/result.hpp>
6#include <boost/core/lightweight_test.hpp>
7
8using namespace boost::system;
9
10// Tricky mixed construction cases
11// https://github.com/boostorg/system/issues/104
12// https://brevzin.github.io//c++/2023/01/18/optional-construction/
13
14int main()
15{
16 {
17 result<int> r( make_error_code( e: errc::invalid_argument ) );
18 result<result<int>> r2( r );
19
20 BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.value(), r );
21 }
22
23 {
24 result<int> r( 5 );
25 result<result<int>> r2( r );
26
27 BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.value(), r );
28 }
29
30 {
31 result<int> const r( make_error_code( e: errc::invalid_argument ) );
32 result<result<int>> r2( r );
33
34 BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.value(), r );
35 }
36
37 {
38 result<int> const r( 5 );
39 result<result<int>> r2( r );
40
41 BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.value(), r );
42 }
43
44 {
45 result<int> r( make_error_code( e: errc::invalid_argument ) );
46 result<result<int>> r2( std::move( r ) );
47
48 BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.value(), r );
49 }
50
51 {
52 result<int> r( 5 );
53 result<result<int>> r2( std::move( r ) );
54
55 BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2.value(), r );
56 }
57
58 return boost::report_errors();
59}
60

source code of boost/libs/system/test/result_value_construct4.cpp