From: Ville Voutilainen Date: Tue, 26 Mar 2019 12:07:26 +0000 (+0200) Subject: re PR libstdc++/89816 (std::variant move construction regressed since GCC 8.3) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8be4d02ba9f6e6e309dee3d2fa599d806a0d1ef6;p=gcc.git 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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 061ec7ffe10..91d8dbc9a3e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2019-03-26 Ville Voutilainen + + 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 * doc/xml/manual/backwards_compatibility.xml: Remove link to diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index a5b8fa83217..0984e13725a 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -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; + using _Type = remove_reference_t; if constexpr (is_same_v<__remove_cvref_t, remove_cv_t<_Type>> && !is_same_v<_Type, __variant_cookie>) - ::new ((void*)std::addressof(__this_mem)) + ::new (__storage) _Type(std::forward(__rhs_mem)); return {}; - }, __variant_cast<_Types...>(__lhs), - __variant_cast<_Types...>(std::forward(__rhs))); + }, __variant_cast<_Types...>(std::forward(__rhs))); } // The following are (Copy|Move) (ctor|assign) layers for forwarding