@@ -28,6 +28,26 @@ const void * test_nullptr = variant_nullptr;
2828// Note: variant_BETWEEN() is not be available when std::variant is used:
2929#define variant_t_BETWEEN ( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) )
3030
31+ #ifndef variant_COMPILER_VERSION
32+ # define variant_COMPILER_VERSION ( major, minor, patch ) ( 10 * ( 10 * (major) + (minor) ) + (patch) )
33+ #endif
34+
35+ #ifndef variant_COMPILER_CLANG_VERSION
36+ # if defined(__clang__)
37+ # define variant_COMPILER_CLANG_VERSION variant_COMPILER_VERSION (__clang_major__, __clang_minor__, __clang_patchlevel__)
38+ # else
39+ # define variant_COMPILER_CLANG_VERSION 0
40+ # endif
41+ #endif
42+
43+ #ifndef variant_COMPILER_GNUC_VERSION
44+ # if defined(__GNUC__) && !defined(__clang__)
45+ # define variant_COMPILER_GNUC_VERSION variant_COMPILER_VERSION (__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
46+ # else
47+ # define variant_COMPILER_GNUC_VERSION 0
48+ # endif
49+ #endif
50+
3151// The following tracer code originates as Oracle from Optional by
3252// Andrzej Krzemienski, https://github.com/akrzemi1/Optional.
3353
@@ -519,7 +539,13 @@ CASE( "variant: Allows to move-construct from element (C++11)" )
519539
520540CASE ( " variant: Allows to convert-copy-construct from element" )
521541{
522- #if !( defined(_MSC_VER) && variant_t_BETWEEN(_MSC_VER, 1920, 1930 ) && variant_USES_STD_VARIANT )
542+ #if ( defined(_MSC_VER) && variant_t_BETWEEN(_MSC_VER, 1920, 1930 ) && variant_USES_STD_VARIANT )
543+ EXPECT ( !!" variant: no convert-copy-construct from element with std::variant (VS2019/VC142/1920)" );
544+ #elif ( variant_USES_STD_VARIANT && variant_COMPILER_GNUC_VERSION >= 1010 )
545+ EXPECT ( !!" variant: no convert-copy-construct from element with GCC 10.1 or later" );
546+ #elif ( variant_USES_STD_VARIANT && variant_COMPILER_CLANG_VERSION >= 1100 )
547+ EXPECT ( !!" variant: no convert-copy-construct from element with Clang 11 or later" );
548+ #else
523549 int i = 7 ;
524550
525551 variant<double , std::string> var1 ( i );
@@ -530,23 +556,25 @@ CASE( "variant: Allows to convert-copy-construct from element" )
530556
531557 EXPECT ( var2.index () == 0u );
532558 EXPECT ( get<0 >(var2) == lest::approx (7 ) );
533- #else
534- EXPECT ( !!" variant: no convert-copy-construct from element with std::variant (VS2019/VC142/1920)" );
535559#endif
536560}
537561
538562CASE ( " variant: Allows to convert-move-construct from element (C++11)" )
539563{
540564#if variant_CPP11_OR_GREATER
541- #if !( defined(_MSC_VER) && variant_t_BETWEEN(_MSC_VER, 1920, 1930 ) && variant_USES_STD_VARIANT )
565+ #if ( defined(_MSC_VER) && variant_t_BETWEEN(_MSC_VER, 1920, 1930 ) && variant_USES_STD_VARIANT )
566+ EXPECT ( !!" variant: no convert-copy-construct from element with std::variant (VS2019/VC142/1920)" );
567+ #elif ( variant_USES_STD_VARIANT && variant_COMPILER_GNUC_VERSION >= 1010 )
568+ EXPECT ( !!" variant: no convert-copy-construct from element with GCC 10.1 or later" );
569+ #elif ( variant_USES_STD_VARIANT && variant_COMPILER_CLANG_VERSION >= 1100 )
570+ EXPECT ( !!" variant: no convert-copy-construct from element with Clang 11 or later" );
571+ #else
542572 struct Int { operator int () { return 7 ; } };
543573
544574 variant<double , std::string> var ( Int{} );
545575
546576 EXPECT ( var.index () == 0u );
547577 EXPECT ( get<0 >(var) == lest::approx (7 ) );
548- #else
549- EXPECT ( !!" variant: no convert-copy-construct from element with std::variant (VS2019/VC142/1920)" );
550578#endif
551579#else
552580 EXPECT ( !!" variant: move-construction is not available (no C++11)" );
@@ -1642,7 +1670,7 @@ namespace issue_31 {
16421670 CopyOnly ( CopyOnly const & ) {}
16431671 CopyOnly & operator =( CopyOnly const & ) { return *this ; }
16441672
1645- #if variant_CPP11_OR_GREATER
1673+ #if variant_CPP11_OR_GREATER && !(variant_USES_STD_VARIANT && defined(_LIBCPP_VERSION))
16461674 CopyOnly ( CopyOnly && ) = delete;
16471675 CopyOnly & operator =( CopyOnly && ) = delete ;
16481676#endif
0 commit comments