diff --git a/include/etl/private/variant_variadic.h b/include/etl/private/variant_variadic.h index 7b2ac4be..31ac4ae8 100644 --- a/include/etl/private/variant_variadic.h +++ b/include/etl/private/variant_variadic.h @@ -312,6 +312,24 @@ namespace etl template using select_alternative_index = decltype(conversion_overloads::select(etl::declval())); + //************************************************************************* + /// Helpers for identifying in-place tags. + //************************************************************************* + template + struct is_in_place_tag : etl::false_type + { + }; + + template + struct is_in_place_tag > : etl::true_type + { + }; + + template + struct is_in_place_tag > : etl::true_type + { + }; + //******************************************* /// Constexpr get by index from variadic_union. //******************************************* @@ -1075,7 +1093,9 @@ namespace etl //*************************************************************************** #include "diagnostic_uninitialized_push.h" template < typename T, bool Trivial_ = Is_Trivially_Destructible_Suite, - etl::enable_if_t, variant>::value && !Trivial_, int> = 0, + etl::enable_if_t< !etl::is_same, variant>::value && !Trivial_ + && !private_variant::is_in_place_tag >::value, + int> = 0, size_t AlternativeIndex = private_variant::select_alternative_index::value, typename TAlternative = type_from_index, etl::enable_if_t::value, int> = 0> ETL_CONSTEXPR14 variant(T&& value) @@ -1085,7 +1105,9 @@ namespace etl } template < typename T, bool Trivial_ = Is_Trivially_Destructible_Suite, - etl::enable_if_t, variant>::value && Trivial_, int> = 0, + etl::enable_if_t, variant>::value && Trivial_ + && !private_variant::is_in_place_tag >::value, + int> = 0, size_t AlternativeIndex = private_variant::select_alternative_index::value, typename TAlternative = type_from_index, etl::enable_if_t::value, int> = 0 > constexpr variant(T&& value) diff --git a/test/test_variant_variadic.cpp b/test/test_variant_variadic.cpp index 71881fd6..bfa8b953 100644 --- a/test/test_variant_variadic.cpp +++ b/test/test_variant_variadic.cpp @@ -918,6 +918,12 @@ namespace CHECK(!(std::is_constructible, AmbiguousIntLong>::value)); CHECK(!(std::is_constructible, AmbiguousIntLong>::value)); + + // The converting constructor should not accept in-place type or index tags. + CHECK((!std::is_constructible>, etl::in_place_type_t>::value)); + CHECK((!std::is_constructible>, etl::in_place_type_t>::value)); + CHECK((!std::is_constructible>, etl::in_place_index_t<1U>>::value)); + CHECK((!std::is_constructible>, etl::in_place_index_t<2U>>::value)); } //*************************************************************************