diff --git a/include/boost/mp11/function.hpp b/include/boost/mp11/function.hpp index 24054b6..8ff66e5 100644 --- a/include/boost/mp11/function.hpp +++ b/include/boost/mp11/function.hpp @@ -87,9 +87,9 @@ template using mp_and = typename detail::mp_and_impl>: #endif // mp_all -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) || BOOST_WORKAROUND( BOOST_GCC, < 40800 ) +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) || BOOST_WORKAROUND( BOOST_GCC, < 70200 ) -template using mp_all = mp_bool< mp_count_if< mp_list, mp_to_bool >::value == sizeof...(T) >; +template using mp_all = mp_bool< mp_count_if< mp_list, mp_not >::value == 0 >; #elif defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) @@ -132,7 +132,7 @@ template struct mp_or_impl } // namespace detail // mp_any -#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) +#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) && !BOOST_WORKAROUND( BOOST_GCC, < 70200 ) template using mp_any = mp_bool<(static_cast(T::value) || ...)>; diff --git a/test/mp_all.cpp b/test/mp_all.cpp index 6b5e2d7..64c40e8 100644 --- a/test/mp_all.cpp +++ b/test/mp_all.cpp @@ -12,9 +12,13 @@ #include #include +using boost::mp11::mp_all; + +template using check1 = mp_all, std::is_copy_constructible..., std::is_copy_assignable...>; +template using check2 = mp_all, mp_all..., mp_all...>>>; + int main() { - using boost::mp11::mp_all; using boost::mp11::mp_true; using boost::mp11::mp_false; using boost::mp11::mp_int; @@ -53,5 +57,13 @@ int main() BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_size_t<114>, mp_size_t<8>, mp_size_t<94>>, mp_true>)); BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_size_t<114>, mp_size_t<0>, mp_size_t<94>>, mp_false>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + +#if !BOOST_WORKAROUND( BOOST_GCC, < 40900 ) + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + +#endif + return boost::report_errors(); } diff --git a/test/mp_any.cpp b/test/mp_any.cpp index 9619522..4780ea9 100644 --- a/test/mp_any.cpp +++ b/test/mp_any.cpp @@ -12,9 +12,22 @@ #include #include +using boost::mp11::mp_any; +using boost::mp11::mp_all; + +template using check1 = mp_any..., mp_any...>>; +template using check2 = mp_any...>, std::is_nothrow_move_constructible...>; +template using check3 = mp_any...>, std::is_nothrow_default_constructible...>; + +template struct variant_base_impl {}; +#if BOOST_WORKAROUND( BOOST_GCC, < 40800 ) +template using variant_base = variant_base_impl...>::value, mp_any...>, std::is_nothrow_default_constructible...>::value, T...>; +#else +template using variant_base = variant_base_impl...>::value, mp_any...>, std::is_nothrow_default_constructible...>::value, T...>; +#endif + int main() { - using boost::mp11::mp_any; using boost::mp11::mp_true; using boost::mp11::mp_false; using boost::mp11::mp_int; @@ -58,5 +71,11 @@ int main() BOOST_TEST_TRAIT_TRUE((std::is_same, mp_int<0>, mp_false, mp_size_t<141>>, mp_true>)); BOOST_TEST_TRAIT_TRUE((std::is_same, mp_int<0>, mp_false>, mp_false>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + + variant_base(); + return boost::report_errors(); }