// Copyright 2024 Christian Mazakas // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #if !defined(__cpp_noexcept_function_type) BOOST_PRAGMA_MESSAGE("Test skipped, __cpp_noexcept_function_type is not defined") int main() {} #else #include #include #include #include int f0() { return -1; } int f1(int x1) noexcept { return x1; } int g1(int x1) noexcept { return x1 * 2; } int f2(int x1, int x2) { return 10 * x1 + x2; } int f3(int x1, int x2, int x3) noexcept { return 100 * x1 + 10 * x2 + x3; } int g(std::unique_ptr p, std::unique_ptr q) { return 10 * *p + *q; } struct X { int v = 0; X() = default; X(int v_) noexcept : v{v_} {} }; struct Y { int v = 0; Y() = default; explicit Y(int v_) : v{v_} {} }; struct Z { int v = 0; Z() = default; Z(int v_) : v{v_} {} }; namespace compat = boost::compat; int main() { BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); BOOST_TEST_TRAIT_TRUE((std::is_trivially_copyable>)); struct W { int w_; }; BOOST_TEST_TRAIT_FALSE((std::is_assignable, W>)); BOOST_TEST_TRAIT_FALSE((std::is_assignable, W>)); BOOST_TEST_TRAIT_FALSE((std::is_assignable, compat::function_ref>)); BOOST_TEST_TRAIT_FALSE((std::is_assignable, compat::function_ref>)); BOOST_TEST_TRAIT_FALSE( (std::is_assignable, compat::function_ref>)); BOOST_TEST_TRAIT_FALSE( (std::is_assignable, compat::function_ref>)); BOOST_TEST_TRAIT_FALSE( (std::is_assignable, compat::function_ref>)); // f0 { BOOST_TEST_TRAIT_FALSE((std::is_constructible, decltype(f0)>)); BOOST_TEST_TRAIT_FALSE((std::is_constructible, decltype(f0)>)); } // f1 { compat::function_ref fv1(f1); BOOST_TEST_EQ(fv1(1), 1); compat::function_ref fv2(f1); BOOST_TEST_EQ(fv2(1), 1); } // f2 { BOOST_TEST_TRAIT_FALSE((std::is_constructible, decltype(f2)>)); BOOST_TEST_TRAIT_FALSE((std::is_constructible, decltype(f2)>)); } // f3 { compat::function_ref fv1(f3); BOOST_TEST_EQ(fv1(1, 2, 3), 123); compat::function_ref fv2(f3); BOOST_TEST_EQ(fv2(1, 2, 3), 123); } // g { BOOST_TEST_TRAIT_FALSE( (std::is_constructible, std::unique_ptr) noexcept>, decltype(g)>)); BOOST_TEST_TRAIT_FALSE( (std::is_constructible, std::unique_ptr) const noexcept>, decltype(g)>)); } // invoke_r { compat::function_ref fv1(f3); BOOST_TEST_EQ(fv1(1, 2, 3).v, 123); BOOST_TEST_TRAIT_FALSE((std::is_constructible, decltype(f3)>)); BOOST_TEST_TRAIT_FALSE((std::is_constructible, decltype(f3)>)); compat::function_ref fv2(f3); BOOST_TEST_EQ(fv2(1, 2, 3).v, 123); BOOST_TEST_TRAIT_FALSE( (std::is_constructible, decltype(f3)>)); BOOST_TEST_TRAIT_FALSE( (std::is_constructible, decltype(f3)>)); compat::function_ref fv3(f3); fv3(1, 2, 3); compat::function_ref fv4(f3); fv4(1, 2, 3); } // copy construct, copy assign { compat::function_ref fv(f1); compat::function_ref fv2(fv); BOOST_TEST_EQ(fv(42), fv2(42)); fv2 = g1; BOOST_TEST_EQ(fv2(12), 24); compat::function_ref cfv(f1); compat::function_ref cfv2(cfv); BOOST_TEST_EQ(cfv(42), cfv2(42)); cfv2 = g1; BOOST_TEST_EQ(cfv2(24), 48); } return boost::report_errors(); } #endif