]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix move construction of std::tuple with array elements [PR101960]
authorJonathan Wakely <jwakely@redhat.com>
Tue, 12 Oct 2021 14:09:50 +0000 (15:09 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 12 Oct 2021 15:53:56 +0000 (16:53 +0100)
The r12-3022 commit only fixed the case where an array is the last
element of the tuple. This fixes the other cases too. We can just define
the move constructor as defaulted, which does the right thing. Changing
the move constructor to be trivial would be an ABI break, but since the
last base class still has a non-trivial move constructor, defining the
derived ones as defaulted doesn't change anything.

libstdc++-v3/ChangeLog:

PR libstdc++/101960
* include/std/tuple (_Tuple_impl(_Tuple_impl&&)): Define as
defauled.
* testsuite/20_util/tuple/cons/101960.cc: Check tuples with
array elements before the last element.

(cherry picked from commit 7481021364e75ba583972e15ed421a53988368ea)

libstdc++-v3/include/std/tuple
libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc

index 23fad918c573e8d875679156e666ca17785032da..dcf30bd9a8d503bc50a8662a0ce586c4944ae0bf 100644 (file)
@@ -298,13 +298,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       // 2729. Missing SFINAE on std::pair::operator=
       _Tuple_impl& operator=(const _Tuple_impl&) = delete;
 
-      constexpr
-      _Tuple_impl(_Tuple_impl&& __in)
-      noexcept(__and_<is_nothrow_move_constructible<_Head>,
-                     is_nothrow_move_constructible<_Inherited>>::value)
-      : _Inherited(std::move(_M_tail(__in))),
-       _Base(std::forward<_Head>(_M_head(__in)))
-      { }
+      _Tuple_impl(_Tuple_impl&&) = default;
 
       template<typename... _UElements>
        constexpr
index f14604cdc69789a9edb639e3ae44ee9e327edc71..42d17b182ed576cb6ea1f98a75ab0331e2593527 100644 (file)
@@ -1,4 +1,13 @@
 // { dg-do compile { target c++11 } }
 #include <tuple>
+
+// PR libstdc++/101960
+
 std::tuple<int[1]> t;
-auto tt = std::move(t); // PR libstdc++/101960
+auto tt = std::move(t);
+
+std::tuple<int[1], int> t2;
+auto tt2 = std::move(t2);
+
+std::tuple<int[1], int[2], int[3]> t3;
+auto tt3 = std::move(t3);