re PR libstdc++/89816 (std::variant move construction regressed since GCC 8.3)

PR libstdc++/89816

Fix based on a suggestion by Antony Polukhin.
* include/std/variant (__variant_construct): Capture a pointer
to the storage and visit just one variant.

From-SVN: r269940
This commit is contained in:
Ville Voutilainen 2019-03-26 14:07:26 +02:00 committed by Ville Voutilainen
parent f30d4934a9
commit 8be4d02ba9
2 changed files with 12 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2019-03-26 Ville Voutilainen <ville.voutilainen@gmail.com>
PR libstdc++/89816
Fix based on a suggestion by Antony Polukhin.
* include/std/variant (__variant_construct): Capture a pointer
to the storage and visit just one variant.
2019-03-22 Jonathan Wakely <jwakely@redhat.com>
* doc/xml/manual/backwards_compatibility.xml: Remove link to

View File

@ -426,18 +426,18 @@ namespace __variant
void __variant_construct(_Tp&& __lhs, _Up&& __rhs)
{
__lhs._M_index = __rhs._M_index;
__do_visit([](auto&& __this_mem, auto&& __rhs_mem) mutable
void* __storage = std::addressof(__lhs._M_u);
__do_visit([__storage](auto&& __rhs_mem) mutable
-> __detail::__variant::__variant_cookie
{
using _Type = remove_reference_t<decltype(__this_mem)>;
using _Type = remove_reference_t<decltype(__rhs_mem)>;
if constexpr (is_same_v<__remove_cvref_t<decltype(__rhs_mem)>,
remove_cv_t<_Type>>
&& !is_same_v<_Type, __variant_cookie>)
::new ((void*)std::addressof(__this_mem))
::new (__storage)
_Type(std::forward<decltype(__rhs_mem)>(__rhs_mem));
return {};
}, __variant_cast<_Types...>(__lhs),
__variant_cast<_Types...>(std::forward<decltype(__rhs)>(__rhs)));
}, __variant_cast<_Types...>(std::forward<decltype(__rhs)>(__rhs)));
}
// The following are (Copy|Move) (ctor|assign) layers for forwarding