// Copyright (c) 2018-2020 Emil Dotchevski and Reverge Studios, 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 "_test_ec.hpp" #include "lightweight_test.hpp" namespace leaf = boost::leaf; enum class my_error { e1=1, e2, e3 }; struct e_my_error { my_error value; }; struct e_error_code { std::error_code value; }; struct my_exception: std::exception { int value; my_exception(): value(0) { } my_exception(int v): value(v) { } }; static_assert(leaf::leaf_detail::handler_argument_traits>::requires_catch, "requires_catch deduction error"); static_assert(!leaf::leaf_detail::handler_argument_traits>::requires_catch, "requires_catch deduction error"); #if __cplusplus >= 201703L static_assert(leaf::leaf_detail::handler_argument_traits>::requires_catch, "requires_catch deduction error"); #endif template bool test(E const * e ) { if( M::evaluate(e) ) { M m(e); BOOST_TEST_EQ(e, &m.matched()); return true; } else return false; } int main() { { int e = 42; static_assert(std::is_same::match_type>::value, "match type deduction error"); BOOST_TEST(( test>(&e) )); BOOST_TEST(( !test>(&e) )); BOOST_TEST(( test>(&e) )); } { my_error e = my_error::e1; static_assert(std::is_same::match_type>::value, "match type deduction error"); BOOST_TEST(( test>(&e) )); BOOST_TEST(( !test>(&e) )); BOOST_TEST(( test>(&e) )); } { e_my_error e = { my_error::e1 }; static_assert(std::is_same::match_type>::value, "match type deduction error"); BOOST_TEST(( test>(&e) )); BOOST_TEST(( !test>(&e) )); BOOST_TEST(( test>(&e) )); #if __cplusplus >= 201703L static_assert(std::is_same::match_type>::value, "match type deduction error"); BOOST_TEST(( test>(&e) )); BOOST_TEST(( !test>(&e) )); BOOST_TEST(( test>(&e) )); #endif } { std::error_code e = errc_a::a0; static_assert(std::is_same, cond_x::x00>::match_type>::value, "match type deduction error"); BOOST_TEST(( test, cond_x::x00>>(&e) )); BOOST_TEST(( !test, cond_x::x11>>(&e) )); BOOST_TEST(( test, cond_x::x11, cond_x::x00>>(&e) )); #if __cplusplus >= 201703L static_assert(std::is_same::match_type>::value, "match type deduction error"); BOOST_TEST(( test>(&e) )); BOOST_TEST(( !test>(&e) )); BOOST_TEST(( test>(&e) )); #endif } { e_error_code e = { errc_a::a0 }; static_assert(std::is_same, cond_x::x00>::match_type>::value, "match type deduction error"); BOOST_TEST(( test, cond_x::x00>>(&e) )); BOOST_TEST(( !test, cond_x::x11>>(&e) )); BOOST_TEST(( test, cond_x::x11, cond_x::x00>>(&e) )); #if __cplusplus >= 201703L static_assert(std::is_same::match_type>::value, "match type deduction error"); BOOST_TEST(( test>(&e) )); BOOST_TEST(( !test>(&e) )); BOOST_TEST(( test>(&e) )); static_assert(std::is_same::match_type>::value, "match type deduction error"); BOOST_TEST(( test>(&e) )); BOOST_TEST(( !test>(&e) )); BOOST_TEST(( test>(&e) )); #endif } return boost::report_errors(); }