]> 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:05:15 +0000 (16:05 +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.

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

index 94a4f0afd3169ff51958516d35b25629eab98234..aaee0b8826a96fcceff4c95d56cd4a184fdffe52 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);