diff --git a/include/etl/private/variant_variadic.h b/include/etl/private/variant_variadic.h index 8e7670df..7b2ac4be 100644 --- a/include/etl/private/variant_variadic.h +++ b/include/etl/private/variant_variadic.h @@ -1266,17 +1266,15 @@ namespace etl /// Move assignment operator for type. ///\param value The value to assign. //*************************************************************************** - template < - typename T, - etl::enable_if_t, variant>::value && etl::is_one_of, TTypes...>::value, int> = 0> + template < typename T, etl::enable_if_t, variant>::value, int> = 0, + size_t AlternativeIndex = private_variant::select_alternative_index::value, + typename TAlternative = type_from_index, etl::enable_if_t::value, int> = 0> variant& operator=(T&& value) { - using type = etl::remove_cvref_t; - do_destroy(); - do_construct(etl::forward(value)); + do_construct(etl::forward(value)); - type_id = index_of_type::value; + type_id = AlternativeIndex; return *this; } diff --git a/test/test_variant_variadic.cpp b/test/test_variant_variadic.cpp index 8c8d6ac1..71881fd6 100644 --- a/test/test_variant_variadic.cpp +++ b/test/test_variant_variadic.cpp @@ -1468,12 +1468,19 @@ namespace //************************************************************************* TEST(test_assign_from_value) { + // No conversion required std::string text("Some Text"); test_variant_etl_3 variant_etl; variant_etl = text; CHECK_EQUAL(text, etl::get(variant_etl)); + + // Conversion from float to double required + etl::variant variant_double; + variant_double = 1.5f; + + CHECK_EQUAL(1.5, etl::get(variant_double)); } //*************************************************************************