aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Shen <timshen@google.com>2016-09-22 08:45:55 +0000
committerTim Shen <timshen@gcc.gnu.org>2016-09-22 08:45:55 +0000
commitc42bc5d73bcfa5c631a4da35830a710a11d507b7 (patch)
treeba386e9d2b903162a443a7ca5dd8e359c7987b4e
parenta8de3002f19eb09cf95d36f1a97e30f234df7d9e (diff)
downloadgcc-c42bc5d73bcfa5c631a4da35830a710a11d507b7.zip
gcc-c42bc5d73bcfa5c631a4da35830a710a11d507b7.tar.gz
gcc-c42bc5d73bcfa5c631a4da35830a710a11d507b7.tar.bz2
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
-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()