diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-10-12 15:09:50 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-10-12 16:05:15 +0100 |
commit | 7481021364e75ba583972e15ed421a53988368ea (patch) | |
tree | 153fe85eed952f390dc504d9e5982e48f25da0bb | |
parent | d9dfd7ad3e0196f60a3fc6df6d65a40fb905409f (diff) | |
download | gcc-7481021364e75ba583972e15ed421a53988368ea.tar.gz |
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.
-rw-r--r-- | libstdc++-v3/include/std/tuple | 8 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc | 11 |
2 files changed, 11 insertions, 8 deletions
diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple index 94a4f0afd31..aaee0b8826a 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<_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 diff --git a/libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc b/libstdc++-v3/testsuite/20_util/tuple/cons/101960.cc index f14604cdc69..42d17b182ed 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 <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); |