diff --git a/include/boost/mp11/detail/mp_with_index.hpp b/include/boost/mp11/detail/mp_with_index.hpp index 9843f83..2d2a66f 100644 --- a/include/boost/mp11/detail/mp_with_index.hpp +++ b/include/boost/mp11/detail/mp_with_index.hpp @@ -20,6 +20,12 @@ # define BOOST_MP11_CONSTEXPR14 #endif +#if defined( _MSC_VER ) && !defined( __clang__ ) +# define BOOST_MP11_UNREACHABLE() __assume(false) +#else +# define BOOST_MP11_UNREACHABLE() __builtin_unreachable() +#endif + namespace boost { namespace mp11 @@ -75,7 +81,8 @@ template<> struct mp_with_index_impl_<2> switch( i ) { case 0: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -88,7 +95,8 @@ template<> struct mp_with_index_impl_<3> { case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -102,7 +110,8 @@ template<> struct mp_with_index_impl_<4> case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -117,7 +126,8 @@ template<> struct mp_with_index_impl_<5> case 1: return std::forward(f)( mp_size_t() ); case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -133,7 +143,8 @@ template<> struct mp_with_index_impl_<6> case 2: return std::forward(f)( mp_size_t() ); case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -150,7 +161,8 @@ template<> struct mp_with_index_impl_<7> case 3: return std::forward(f)( mp_size_t() ); case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -168,7 +180,8 @@ template<> struct mp_with_index_impl_<8> case 4: return std::forward(f)( mp_size_t() ); case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -187,7 +200,8 @@ template<> struct mp_with_index_impl_<9> case 5: return std::forward(f)( mp_size_t() ); case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -207,7 +221,8 @@ template<> struct mp_with_index_impl_<10> case 6: return std::forward(f)( mp_size_t() ); case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -228,7 +243,8 @@ template<> struct mp_with_index_impl_<11> case 7: return std::forward(f)( mp_size_t() ); case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 10: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -250,7 +266,8 @@ template<> struct mp_with_index_impl_<12> case 8: return std::forward(f)( mp_size_t() ); case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 11: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -273,7 +290,8 @@ template<> struct mp_with_index_impl_<13> case 9: return std::forward(f)( mp_size_t() ); case 10: return std::forward(f)( mp_size_t() ); case 11: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 12: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -297,7 +315,8 @@ template<> struct mp_with_index_impl_<14> case 10: return std::forward(f)( mp_size_t() ); case 11: return std::forward(f)( mp_size_t() ); case 12: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 13: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -322,7 +341,8 @@ template<> struct mp_with_index_impl_<15> case 11: return std::forward(f)( mp_size_t() ); case 12: return std::forward(f)( mp_size_t() ); case 13: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 14: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -348,7 +368,8 @@ template<> struct mp_with_index_impl_<16> case 12: return std::forward(f)( mp_size_t() ); case 13: return std::forward(f)( mp_size_t() ); case 14: return std::forward(f)( mp_size_t() ); - default: return std::forward(f)( mp_size_t() ); + case 15: return std::forward(f)( mp_size_t() ); + default: BOOST_MP11_UNREACHABLE(); } } }; @@ -367,6 +388,7 @@ template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval