From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 6BED938768BD; Tue, 28 Mar 2023 23:35:36 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6BED938768BD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1680046536; bh=tvt87Nf+/mGq1YrMIhjtv9z4wkt/j4jxySbBNYNFaVA=; h=From:To:Subject:Date:From; b=TAMvoXdq/arAhpe7aeq939CyqA/YQ9Iy/mUOr3LmUZeb4xVV+s0rXTRvICeUQnvNo wpBvX+Tm9BCIGTaSM481dNBAG3c7IwNP7t/RH0uiY82RCU+rXUCvwh+/p8/NQckMEG s/iZbC5q+DZrJrvmfVUbRgpPIlWVE0S7P07jCsfM= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-9350] libstdc++: Add missing move in ranges::copy X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: b1f0c065022784680044d30fa269025ae44b43de X-Git-Newrev: 7325d06f59da9a6fd3bea06e84bf93a8ee0c5bcb Message-Id: <20230328233536.6BED938768BD@sourceware.org> Date: Tue, 28 Mar 2023 23:35:36 +0000 (GMT) List-Id: https://gcc.gnu.org/g:7325d06f59da9a6fd3bea06e84bf93a8ee0c5bcb commit r12-9350-g7325d06f59da9a6fd3bea06e84bf93a8ee0c5bcb Author: Jonathan Wakely Date: Thu Nov 3 09:17:57 2022 +0000 libstdc++: Add missing move in ranges::copy This is needed to support a move-only output iterator when the input iterators are specializations of __normal_iterator. libstdc++-v3/ChangeLog: * include/bits/ranges_algobase.h (__detail::__copy_or_move): Move output iterator. * testsuite/25_algorithms/copy/constrained.cc: Check copying to move-only output iterator. (cherry picked from commit 2ff0e62275b1c322a8b65f38f8336f37d31c30e4) Diff: --- libstdc++-v3/include/bits/ranges_algobase.h | 2 +- .../testsuite/25_algorithms/copy/constrained.cc | 24 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/bits/ranges_algobase.h b/libstdc++-v3/include/bits/ranges_algobase.h index 1bbc44fc668..d5dd43ec4bc 100644 --- a/libstdc++-v3/include/bits/ranges_algobase.h +++ b/libstdc++-v3/include/bits/ranges_algobase.h @@ -240,7 +240,7 @@ namespace ranges { auto [__in,__out] = ranges::__copy_or_move<_IsMove>(__first.base(), __last.base(), - __result); + std::move(__result)); return {decltype(__first){__in}, std::move(__out)}; } else if constexpr (__is_normal_iterator<_Out>) diff --git a/libstdc++-v3/testsuite/25_algorithms/copy/constrained.cc b/libstdc++-v3/testsuite/25_algorithms/copy/constrained.cc index 98f038a6c5f..444dfa78894 100644 --- a/libstdc++-v3/testsuite/25_algorithms/copy/constrained.cc +++ b/libstdc++-v3/testsuite/25_algorithms/copy/constrained.cc @@ -226,6 +226,29 @@ test06() VERIFY( ranges::equal(v, (int[]){1,2,3,0}) ); } +void +test07() +{ + struct move_only_output_iterator + { + using value_type = int; + using difference_type = short; + using iterator_category = std::output_iterator_tag; + + move_only_output_iterator() = default; + move_only_output_iterator(move_only_output_iterator&&) = default; + move_only_output_iterator& operator=(move_only_output_iterator&&) = default; + + move_only_output_iterator& operator*() { return *this; } + move_only_output_iterator& operator++() { return *this; } + move_only_output_iterator operator++(int) { return std::move(*this); } + + void operator=(int) { } + }; + + ranges::copy(std::vector{1,2,3}, move_only_output_iterator{}); +} + int main() { @@ -235,4 +258,5 @@ main() test04(); static_assert(test05()); test06(); + test07(); }