Commit c42bc5d7 by Tim Shen Committed by Tim Shen

variant (variant::operator=): Fix assignment on references.

	* libstdc++-v3/include/std/variant (variant::operator=): Fix assignment
	on references.
	* libstdc++-v3/testsuite/20_util/variant/compile.cc: Add test.

From-SVN: r240343
parent a8de3002
2016-09-22 Tim Shen <timshen@google.com> 2016-09-22 Tim Shen <timshen@google.com>
* libstdc++-v3/include/std/variant (variant::operator=): Fix assignment
on references.
* libstdc++-v3/testsuite/20_util/variant/compile.cc: Add test.
2016-09-22 Tim Shen <timshen@google.com>
PR libstdc++/77641 PR libstdc++/77641
* include/std/variant (_Variant_storage::_Variant_storage): * include/std/variant (_Variant_storage::_Variant_storage):
Change _Variant_storage's union to be default constructible. Change _Variant_storage's union to be default constructible.
......
...@@ -1147,8 +1147,7 @@ namespace __variant ...@@ -1147,8 +1147,7 @@ namespace __variant
{ {
constexpr auto __index = __accepted_index<_Tp&&>; constexpr auto __index = __accepted_index<_Tp&&>;
if (index() == __index) if (index() == __index)
*static_cast<__storage<__to_type<__index>>*>(this->_M_storage()) std::get<__index>(*this) = std::forward<_Tp>(__rhs);
= forward<_Tp>(__rhs);
else else
this->emplace<__index>(forward<_Tp>(__rhs)); this->emplace<__index>(forward<_Tp>(__rhs));
__glibcxx_assert(holds_alternative<__accepted_type<_Tp&&>>(*this)); __glibcxx_assert(holds_alternative<__accepted_type<_Tp&&>>(*this));
......
...@@ -169,6 +169,12 @@ void copy_assign() ...@@ -169,6 +169,12 @@ void copy_assign()
variant<DefaultNoexcept> a; variant<DefaultNoexcept> a;
static_assert(!noexcept(a = a), ""); static_assert(!noexcept(a = a), "");
} }
{
float f1 = 1.0f, f2 = 2.0f;
std::variant<float&> v1(f1);
v1 = f2;
}
} }
void move_assign() void move_assign()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment