diff --git a/test/Jamfile b/test/Jamfile index ad7b7e1..4a5f6fe 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -141,4 +141,5 @@ compile variant_uses_double_storage.cpp ; run variant_derived_construct2.cpp ; compile variant_visit_cx.cpp : [ requires cxx14_constexpr ] ; +compile variant_visit_cx_2.cpp : [ requires cxx14_constexpr ] ; compile variant_visit_r_cx.cpp : [ requires cxx14_constexpr ] ; diff --git a/test/variant_visit_cx_2.cpp b/test/variant_visit_cx_2.cpp new file mode 100644 index 0000000..65c5d30 --- /dev/null +++ b/test/variant_visit_cx_2.cpp @@ -0,0 +1,53 @@ +// Copyright 2017, 2024 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if !( defined(__cpp_constexpr) && __cpp_constexpr >= 201603L ) + +BOOST_PRAGMA_MESSAGE("Skipping constexpr visit test because __cpp_constexpr < 201603L") +int main() {} + +#elif !defined(BOOST_MP11_HAS_CXX14_CONSTEXPR) + +BOOST_PRAGMA_MESSAGE("Skipping constexpr visit test because BOOST_MP11_HAS_CXX14_CONSTEXPR is not defined") +int main() {} + +#else + +using namespace boost::variant2; + +struct F +{ + constexpr int operator()( int x1, int x2 ) const + { + return x1 + x2; + } + + constexpr int operator()( int x1, int x2, int x3 ) const + { + return x1 + x2 + x3; + } +}; + +#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) + +int main() +{ + { + constexpr variant v1( 1 ); + constexpr variant v2( '2' ); + STATIC_ASSERT( visit( F(), v1, v2 ) == 1 + '2' ); + } + + { + constexpr variant v1( 1 ); + constexpr variant v2( 2 ); + constexpr variant v3( '3' ); + STATIC_ASSERT( visit( F(), v1, v2, v3 ) == 1 + 2 + '3' ); + } +} + +#endif