re PR libstdc++/89816 (std::variant move construction regressed since GCC 8.3)
authorVille Voutilainen <ville.voutilainen@gmail.com>
Tue, 26 Mar 2019 12:07:26 +0000 (14:07 +0200)
committerVille Voutilainen <ville@gcc.gnu.org>
Tue, 26 Mar 2019 12:07:26 +0000 (14:07 +0200)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/variant

index 061ec7ffe10826414447941692c28d998445af3f..91d8dbc9a3e2a52fb81265c9d8ce0b833e77082a 100644 (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
index a5b8fa83217b33018c4019e2984134088919b079..0984e13725a230268f7a3ea5eadc45094c6f9a09 100644 (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