// Copyright 2017, 2026 Peter Dimov. // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #if defined(BOOST_NO_CXX14_CONSTEXPR) BOOST_PRAGMA_MESSAGE( "Test skipped because BOOST_NO_CXX14_CONSTEXPR is defined" ) int main() {} #elif defined(BOOST_GCC) && BOOST_GCC < 70000 BOOST_PRAGMA_MESSAGE( "Test skipped because BOOST_GCC < 70000" ) int main() {} #else using namespace boost::variant2; struct X { int v; X() = default; constexpr X( int v ): v( v ) {} constexpr operator int() const { return v; } }; struct Y { int v; constexpr Y(): v() {} constexpr Y( int v ): v( v ) {} constexpr operator int() const { return v; } }; enum E { v }; #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) template constexpr variant_alternative_t test( A const& a ) { V v; v = a; return get(v); } int main() { { constexpr variant v( 1 ); constexpr auto w = test, 0>( v ); STATIC_ASSERT( w == 1 ); } { constexpr variant v( 1 ); constexpr auto w = test, 0>( v ); STATIC_ASSERT( w == 1 ); } #if defined( BOOST_LIBSTDCXX_VERSION ) && BOOST_LIBSTDCXX_VERSION < 50000 #else { constexpr variant v( 1 ); constexpr auto w = test, 0>( v ); STATIC_ASSERT( w == 1 ); } #endif { constexpr variant v( 1 ); constexpr auto w = test, 0>( v ); STATIC_ASSERT( w == 1 ); } { constexpr variant v( 3.0f ); constexpr auto w = test, 1>( v ); STATIC_ASSERT( w == 3.0f ); } { constexpr variant v( 3.0f ); constexpr auto w = test, 2>( v ); STATIC_ASSERT( w == 3.0f ); } { constexpr variant v( 1 ); constexpr auto w = test, 2>( v ); STATIC_ASSERT( w == 1 ); } { constexpr variant v( X(1) ); constexpr auto w = test, 4>( v ); STATIC_ASSERT( w == 1 ); } #if defined( BOOST_LIBSTDCXX_VERSION ) && BOOST_LIBSTDCXX_VERSION < 50000 #else { constexpr variant v( 1 ); constexpr auto w = test, 2>( v ); STATIC_ASSERT( w == 1 ); } { constexpr variant v( Y(1) ); constexpr auto w = test, 4>( v ); STATIC_ASSERT( w == 1 ); } #endif } #endif