diff options
| -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() |
