aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/std/variant3
-rw-r--r--libstdc++-v3/testsuite/20_util/variant/compile.cc6
3 files changed, 13 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 0de2044..ff984c3 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,11 @@
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
* include/std/variant (_Variant_storage::_Variant_storage):
Change _Variant_storage's union to be default constructible.
diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
index 013884b..1ad33fc 100644
--- a/libstdc++-v3/include/std/variant
+++ b/libstdc++-v3/include/std/variant
@@ -1147,8 +1147,7 @@ namespace __variant
{
constexpr auto __index = __accepted_index<_Tp&&>;
if (index() == __index)
- *static_cast<__storage<__to_type<__index>>*>(this->_M_storage())
- = forward<_Tp>(__rhs);
+ std::get<__index>(*this) = std::forward<_Tp>(__rhs);
else
this->emplace<__index>(forward<_Tp>(__rhs));
__glibcxx_assert(holds_alternative<__accepted_type<_Tp&&>>(*this));
diff --git a/libstdc++-v3/testsuite/20_util/variant/compile.cc b/libstdc++-v3/testsuite/20_util/variant/compile.cc
index 99f980a..a0a8d70 100644
--- a/libstdc++-v3/testsuite/20_util/variant/compile.cc
+++ b/libstdc++-v3/testsuite/20_util/variant/compile.cc
@@ -169,6 +169,12 @@ void copy_assign()
variant<DefaultNoexcept> a;
static_assert(!noexcept(a = a), "");
}
+
+ {
+ float f1 = 1.0f, f2 = 2.0f;
+ std::variant<float&> v1(f1);
+ v1 = f2;
+ }
}
void move_assign()