From 9a69b1213c064660b13a71dcb50001ffed8b2243 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 31 May 2017 07:08:56 +0300 Subject: [PATCH 1/7] g++ 6 has problems with mp_and --- include/boost/mp11/function.hpp | 2 +- test/mp_all.cpp | 9 ++++++++- test/mp_any.cpp | 7 ++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/boost/mp11/function.hpp b/include/boost/mp11/function.hpp index 24054b6..7c99b4a 100644 --- a/include/boost/mp11/function.hpp +++ b/include/boost/mp11/function.hpp @@ -87,7 +87,7 @@ 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, < 70000 ) template using mp_all = mp_bool< mp_count_if< mp_list, mp_to_bool >::value == sizeof...(T) >; diff --git a/test/mp_all.cpp b/test/mp_all.cpp index 6b5e2d7..9974cfb 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,8 @@ 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>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + return boost::report_errors(); } diff --git a/test/mp_any.cpp b/test/mp_any.cpp index 9619522..53f5574 100644 --- a/test/mp_any.cpp +++ b/test/mp_any.cpp @@ -12,9 +12,12 @@ #include #include +using boost::mp11::mp_any; + +template using check = mp_any..., mp_any...>>; + int main() { - using boost::mp11::mp_any; using boost::mp11::mp_true; using boost::mp11::mp_false; using boost::mp11::mp_int; @@ -58,5 +61,7 @@ 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>)); + return boost::report_errors(); } From a768587c7da45ad6b24d2599088b42be11056150 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 31 May 2017 07:22:31 +0300 Subject: [PATCH 2/7] g++6 doesn't like mp_any either --- include/boost/mp11/function.hpp | 2 +- test/mp_any.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/boost/mp11/function.hpp b/include/boost/mp11/function.hpp index 7c99b4a..6def486 100644 --- a/include/boost/mp11/function.hpp +++ b/include/boost/mp11/function.hpp @@ -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, < 70000 ) template using mp_any = mp_bool<(static_cast(T::value) || ...)>; diff --git a/test/mp_any.cpp b/test/mp_any.cpp index 53f5574..6239bb2 100644 --- a/test/mp_any.cpp +++ b/test/mp_any.cpp @@ -13,8 +13,14 @@ #include using boost::mp11::mp_any; +using boost::mp11::mp_all; -template using check = mp_any..., mp_any...>>; +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 {}; +template using variant_base = variant_base_impl...>::value, mp_any...>, std::is_nothrow_default_constructible...>::value, T...>; int main() { @@ -61,7 +67,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>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + + variant_base(); return boost::report_errors(); } From a47c6e3c57f484c22350ee31c9d1db5dd00ddf7c Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 31 May 2017 07:57:02 +0300 Subject: [PATCH 3/7] g++7.1 doesn't quite like mp_all, too; and 5 and earlier also fail in a different way --- include/boost/mp11/function.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/boost/mp11/function.hpp b/include/boost/mp11/function.hpp index 6def486..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, < 70000 ) +#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 ) && !BOOST_WORKAROUND( BOOST_GCC, < 70000 ) +#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) && !BOOST_WORKAROUND( BOOST_GCC, < 70200 ) template using mp_any = mp_bool<(static_cast(T::value) || ...)>; From 5733185780d9e66b4a5c0df51f1037bcee3f49a7 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 31 May 2017 08:40:41 +0300 Subject: [PATCH 4/7] Try a g++ 4.7/4.8 workaround --- include/boost/mp11/function.hpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/include/boost/mp11/function.hpp b/include/boost/mp11/function.hpp index 8ff66e5..3a2d549 100644 --- a/include/boost/mp11/function.hpp +++ b/include/boost/mp11/function.hpp @@ -87,7 +87,18 @@ template using mp_and = typename detail::mp_and_impl>: #endif // mp_all -#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) || BOOST_WORKAROUND( BOOST_GCC, < 70200 ) +#if BOOST_WORKAROUND( BOOST_GCC, < 40900 ) + +namespace detail +{ + +template using mp_to_true = mp_true; + +} // namespace detail + +template using mp_all = mp_to_bool...>, mp_list...>>>; + +#elif BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) || BOOST_WORKAROUND( BOOST_GCC, < 70200 ) template using mp_all = mp_bool< mp_count_if< mp_list, mp_not >::value == 0 >; From d78cf71a978c5cbaa8fa908920af2ea24d8e0a38 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 31 May 2017 09:09:05 +0300 Subject: [PATCH 5/7] Revert previous; disable problematic test on 4.7/4.8 instead --- include/boost/mp11/function.hpp | 13 +------------ test/mp_all.cpp | 5 +++++ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/include/boost/mp11/function.hpp b/include/boost/mp11/function.hpp index 3a2d549..8ff66e5 100644 --- a/include/boost/mp11/function.hpp +++ b/include/boost/mp11/function.hpp @@ -87,18 +87,7 @@ template using mp_and = typename detail::mp_and_impl>: #endif // mp_all -#if BOOST_WORKAROUND( BOOST_GCC, < 40900 ) - -namespace detail -{ - -template using mp_to_true = mp_true; - -} // namespace detail - -template using mp_all = mp_to_bool...>, mp_list...>>>; - -#elif BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) || BOOST_WORKAROUND( BOOST_GCC, < 70200 ) +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) || BOOST_WORKAROUND( BOOST_GCC, < 70200 ) template using mp_all = mp_bool< mp_count_if< mp_list, mp_not >::value == 0 >; diff --git a/test/mp_all.cpp b/test/mp_all.cpp index 9974cfb..64c40e8 100644 --- a/test/mp_all.cpp +++ b/test/mp_all.cpp @@ -58,7 +58,12 @@ int main() 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(); } From 03e950083dc01f972775119ee3935c21ee0fc60b Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 31 May 2017 09:24:02 +0300 Subject: [PATCH 6/7] g++ 4.7 doesn't have is_trivially_destructible --- test/mp_any.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/mp_any.cpp b/test/mp_any.cpp index 6239bb2..4e236d7 100644 --- a/test/mp_any.cpp +++ b/test/mp_any.cpp @@ -20,7 +20,11 @@ template using check2 = mp_any 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() { From 1506f05fbb87a9de49d881b71fc00e62c5a53423 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 31 May 2017 17:29:52 +0300 Subject: [PATCH 7/7] g++ 4.7 doesn't have is_nothrow_destructible either --- test/mp_any.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/mp_any.cpp b/test/mp_any.cpp index 4e236d7..4780ea9 100644 --- a/test/mp_any.cpp +++ b/test/mp_any.cpp @@ -21,7 +21,7 @@ template using check3 = mp_any 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...>; +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