libstdc++: Fix move construction of std::tuple with array elements [PR101960]

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 7481021364)
This commit is contained in:
Jonathan Wakely 2021-10-12 15:09:50 +01:00
parent 7b4e6d75b1
commit e748216c23
2 changed files with 11 additions and 8 deletions

View 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

View 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);