libstdc++: ranges::rotate should use ranges::iter_move [PR121913]
Commit Message
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
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
>
>
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" ;-)
@@ -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)};