From e1edd90c217b5e9d018ff403d5a10f79ad2c4e4c Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 18 Mar 2017 01:05:54 +0200 Subject: [PATCH] Fix clang 3.9 -std=c++1z failures --- include/boost/mp11/algorithm.hpp | 42 ++++++++++++++++++++++++++-- include/boost/mp11/detail/config.hpp | 8 ++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index ac19959..8930660 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -498,7 +498,37 @@ namespace detail template struct mp_find_impl; -#if !defined( BOOST_MP11_NO_CONSTEXPR ) +#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) + +struct mp_index_holder +{ + std::size_t i_; + bool f_; +}; + +constexpr inline mp_index_holder operator+( mp_index_holder const & v, bool f ) +{ + if( v.f_ ) + { + return v; + } + else if( f ) + { + return { v.i_, true }; + } + else + { + return { v.i_ + 1, false }; + } +} + +template class L, class... T, class V> struct mp_find_impl, V> +{ + static constexpr mp_index_holder _v{ 0, false }; + using type = mp_size_t< (_v + ... + std::is_same::value).i_ >; +}; + +#elif !defined( BOOST_MP11_NO_CONSTEXPR ) template class L, class V> struct mp_find_impl, V> { @@ -558,7 +588,15 @@ namespace detail template class P> struct mp_find_if_impl; -#if !defined( BOOST_MP11_NO_CONSTEXPR ) +#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) + +template class L, class... T, template class P> struct mp_find_if_impl, P> +{ + static constexpr mp_index_holder _v{ 0, false }; + using type = mp_size_t< (_v + ... + P::value).i_ >; +}; + +#elif !defined( BOOST_MP11_NO_CONSTEXPR ) template class L, template class P> struct mp_find_if_impl, P> { diff --git a/include/boost/mp11/detail/config.hpp b/include/boost/mp11/detail/config.hpp index 69539aa..3992cdc 100644 --- a/include/boost/mp11/detail/config.hpp +++ b/include/boost/mp11/detail/config.hpp @@ -21,4 +21,12 @@ #endif +#if defined(BOOST_CLANG) && defined(__has_cpp_attribute) +# if __has_cpp_attribute(fallthrough) && __cplusplus >= 201406L // Clang 3.9+ in c++1z mode + +# define BOOST_MP11_HAS_FOLD_EXPRESSIONS + +# endif +#endif + #endif // #ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED