libstdc++: ranges::rotate should use ranges::iter_move [PR121913]

Message ID 20250916151923.2680823-1-jwakely@redhat.com
State Committed
Commit 412a1f78b53709ee60d7b17393cc3a9c9e0b973c
Headers
Series libstdc++: ranges::rotate should use ranges::iter_move [PR121913] |

Commit Message

Jonathan Wakely Sept. 16, 2025, 3:19 p.m. UTC
  The r16-3835-g7801236069a95c change to use ranges::iter_move should also
have used iter_value_t<_Iter> to ensure we get an object of the value
type, not a proxy reference.

libstdc++-v3/ChangeLog:

	PR libstdc++/121913
	* include/bits/ranges_algo.h (__rotate_fn::operator()): Use
	auto_value_t<_Iter> instead of deduced type.
---

Tested powerpc64le-linux.

 libstdc++-v3/include/bits/ranges_algo.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
  

Comments

Patrick Palka Sept. 16, 2025, 4:12 p.m. UTC | #1
On Tue, 16 Sep 2025, Jonathan Wakely wrote:

> The r16-3835-g7801236069a95c change to use ranges::iter_move should also
> have used iter_value_t<_Iter> to ensure we get an object of the value
> type, not a proxy reference.
> 
> libstdc++-v3/ChangeLog:
> 
> 	PR libstdc++/121913
> 	* include/bits/ranges_algo.h (__rotate_fn::operator()): Use
> 	auto_value_t<_Iter> instead of deduced type.

Stale subject line? LGTM besides that

> ---
> 
> Tested powerpc64le-linux.
> 
>  libstdc++-v3/include/bits/ranges_algo.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h
> index ea933be2f604..4025bba9f204 100644
> --- a/libstdc++-v3/include/bits/ranges_algo.h
> +++ b/libstdc++-v3/include/bits/ranges_algo.h
> @@ -1685,7 +1685,7 @@ namespace ranges
>  			{
>  			  auto __mid = ranges::next(__p, __n - 1);
>  			  auto __end = ranges::next(__mid);
> -			  auto __t = ranges::iter_move(__p);
> +			  iter_value_t<_Iter> __t(ranges::iter_move(__p));
>  			  ranges::move(ranges::next(__p), __end, __p);
>  			  *__mid = std::move(__t);
>  			  return {std::move(__ret), std::move(__lasti)};
> @@ -1713,7 +1713,7 @@ namespace ranges
>  			{
>  			  auto __mid = ranges::next(__p, __n - 1);
>  			  auto __end = ranges::next(__mid);
> -			  auto __t = ranges::iter_move(__mid);
> +			  iter_value_t<_Iter> __t(ranges::iter_move(__mid));
>  			  ranges::move_backward(__p, __mid, __end);
>  			  *__p = std::move(__t);
>  			  return {std::move(__ret), std::move(__lasti)};
> -- 
> 2.51.0
> 
>
  
Jonathan Wakely Sept. 16, 2025, 4:37 p.m. UTC | #2
On Tue, 16 Sept 2025 at 17:12, Patrick Palka <ppalka@redhat.com> wrote:
>
> On Tue, 16 Sep 2025, Jonathan Wakely wrote:
>
> > The r16-3835-g7801236069a95c change to use ranges::iter_move should also
> > have used iter_value_t<_Iter> to ensure we get an object of the value
> > type, not a proxy reference.
> >
> > libstdc++-v3/ChangeLog:
> >
> >       PR libstdc++/121913
> >       * include/bits/ranges_algo.h (__rotate_fn::operator()): Use
> >       auto_value_t<_Iter> instead of deduced type.
>
> Stale subject line? LGTM besides that

Oops, yeah I reused the commit message using -c 7801236069a95c and
forgot to change that bit.

Maybe "use ranges::iter_move properly" ;-)
  

Patch

diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h
index ea933be2f604..4025bba9f204 100644
--- a/libstdc++-v3/include/bits/ranges_algo.h
+++ b/libstdc++-v3/include/bits/ranges_algo.h
@@ -1685,7 +1685,7 @@  namespace ranges
 			{
 			  auto __mid = ranges::next(__p, __n - 1);
 			  auto __end = ranges::next(__mid);
-			  auto __t = ranges::iter_move(__p);
+			  iter_value_t<_Iter> __t(ranges::iter_move(__p));
 			  ranges::move(ranges::next(__p), __end, __p);
 			  *__mid = std::move(__t);
 			  return {std::move(__ret), std::move(__lasti)};
@@ -1713,7 +1713,7 @@  namespace ranges
 			{
 			  auto __mid = ranges::next(__p, __n - 1);
 			  auto __end = ranges::next(__mid);
-			  auto __t = ranges::iter_move(__mid);
+			  iter_value_t<_Iter> __t(ranges::iter_move(__mid));
 			  ranges::move_backward(__p, __mid, __end);
 			  *__p = std::move(__t);
 			  return {std::move(__ret), std::move(__lasti)};