diff options
author | Tim Shen <timshen@google.com> | 2016-09-22 08:45:55 +0000 |
---|---|---|
committer | Tim Shen <timshen@gcc.gnu.org> | 2016-09-22 08:45:55 +0000 |
commit | c42bc5d73bcfa5c631a4da35830a710a11d507b7 (patch) | |
tree | ba386e9d2b903162a443a7ca5dd8e359c7987b4e | |
parent | a8de3002f19eb09cf95d36f1a97e30f234df7d9e (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/std/variant | 3 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/variant/compile.cc | 6 |
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() |