From: Jonathan Wakely Date: Tue, 12 Oct 2021 14:09:50 +0000 (+0100) Subject: libstdc++: Fix move construction of std::tuple with array elements [PR101960] X-Git-Tag: basepoints/gcc-13~3957 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7481021364e75ba583972e15ed421a53988368ea;p=thirdparty%2Fgcc.git 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. --- diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index 94a4f0afd316..aaee0b8826a9 100644 --- a/libstdc++-v3/include/std/tuple +++ b/libstdc++-v3/include/std/tuple @@ -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<_Inherited>>::value) - : _Inherited(std::move(_M_tail(__in))), - _Base(std::forward<_Head>(_M_head(__in))) - { } + _Tuple_impl(_Tuple_impl&&) = default; template constexpr diff --git a/libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc b/libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc index f14604cdc697..42d17b182ed5 100644 --- a/libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc +++ b/libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc @@ -1,4 +1,13 @@ // { dg-do compile { target c++11 } } #include + +// PR libstdc++/101960 + std::tuple t; -auto tt = std::move(t); // PR libstdc++/101960 +auto tt = std::move(t); + +std::tuple t2; +auto tt2 = std::move(t2); + +std::tuple t3; +auto tt3 = std::move(t3);