diff --git a/test/Jamfile b/test/Jamfile index 2bed75d..ad7b7e1 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -141,3 +141,4 @@ compile variant_uses_double_storage.cpp ; run variant_derived_construct2.cpp ; compile variant_visit_cx.cpp : [ requires cxx14_constexpr ] ; +compile variant_visit_r_cx.cpp : [ requires cxx14_constexpr ] ; diff --git a/test/variant_visit_r_cx.cpp b/test/variant_visit_r_cx.cpp new file mode 100644 index 0000000..83672b6 --- /dev/null +++ b/test/variant_visit_r_cx.cpp @@ -0,0 +1,52 @@ +// Copyright 2017, 2024 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// http://www.boost.org/LICENSE_1_0.txt + +#include +using namespace boost::variant2; + +#if !defined(BOOST_MP11_HAS_CXX14_CONSTEXPR) + +#include + +BOOST_PRAGMA_MESSAGE("Skipping constexpr visit test because BOOST_MP11_HAS_CXX14_CONSTEXPR is not defined") + +int main() {} + +#else + +struct X +{ + int v; + constexpr operator int() const { return v; } +}; + +struct F +{ + template constexpr T operator()( T x ) const + { + return x; + } +}; + +#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) + +int main() +{ + { + constexpr variant v( 1 ); + STATIC_ASSERT( visit( F(), v ) == 1 ); + } + + { + constexpr variant v( 'a' ); + STATIC_ASSERT( visit( F(), v ) == 'a' ); + } + + { + constexpr variant v( X{2} ); + STATIC_ASSERT( visit( F(), v ) == 2 ); + } +} + +#endif