diff --git a/include/boost/mp11/detail/mp_with_index.hpp b/include/boost/mp11/detail/mp_with_index.hpp index 1062877..3eec9b6 100644 --- a/include/boost/mp11/detail/mp_with_index.hpp +++ b/include/boost/mp11/detail/mp_with_index.hpp @@ -20,10 +20,12 @@ # define BOOST_MP11_CONSTEXPR14 #endif -#if defined( _MSC_VER ) && !defined( __clang__ ) -# define BOOST_MP11_UNREACHABLE() __assume(false) +#if defined( __GNUC__ ) || defined( __clang__ ) +# define BOOST_MP11_UNREACHABLE_DEFAULT default: __builtin_unreachable(); +#elif defined( _MSC_VER ) +# define BOOST_MP11_UNREACHABLE_DEFAULT default: __assume(false); #else -# define BOOST_MP11_UNREACHABLE() __builtin_unreachable() +# define BOOST_MP11_UNREACHABLE_DEFAULT #endif namespace boost @@ -80,7 +82,7 @@ template<> struct mp_with_index_impl_<2> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT case 0: return std::forward(f)( mp_size_t() ); case 1: return std::forward(f)( mp_size_t() ); } @@ -93,7 +95,7 @@ template<> struct mp_with_index_impl_<3> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -107,7 +109,7 @@ template<> struct mp_with_index_impl_<4> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -122,7 +124,7 @@ template<> struct mp_with_index_impl_<5> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -138,7 +140,7 @@ template<> struct mp_with_index_impl_<6> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -155,7 +157,7 @@ template<> struct mp_with_index_impl_<7> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -173,7 +175,7 @@ template<> struct mp_with_index_impl_<8> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -192,7 +194,7 @@ template<> struct mp_with_index_impl_<9> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -212,7 +214,7 @@ template<> struct mp_with_index_impl_<10> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -233,7 +235,7 @@ template<> struct mp_with_index_impl_<11> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -255,7 +257,7 @@ template<> struct mp_with_index_impl_<12> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -278,7 +280,7 @@ template<> struct mp_with_index_impl_<13> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -302,7 +304,7 @@ template<> struct mp_with_index_impl_<14> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -327,7 +329,7 @@ template<> struct mp_with_index_impl_<15> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -353,7 +355,7 @@ template<> struct mp_with_index_impl_<16> { switch( i ) { - default: BOOST_MP11_UNREACHABLE(); + BOOST_MP11_UNREACHABLE_DEFAULT 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() ); @@ -388,7 +390,7 @@ template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval