On Fri, Jun 27, 2025 at 4:45 AM Patrick Palka <ppa...@redhat.com> wrote:
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk and perhaps > 15/14? > Both look good to me thanks. > > -- >8 -- > > PR libstdc++/120789 > > libstdc++-v3/ChangeLog: > > * include/bits/ranges_algo.h (__unique_fn::operator()): Use > ranges::iter_move(iter) instead of std::move(*iter). > * testsuite/25_algorithms/unique/120789.cc: New test. > --- > libstdc++-v3/include/bits/ranges_algo.h | 2 +- > .../testsuite/25_algorithms/unique/120789.cc | 36 +++++++++++++++++++ > 2 files changed, 37 insertions(+), 1 deletion(-) > create mode 100644 libstdc++-v3/testsuite/25_algorithms/unique/120789.cc > > diff --git a/libstdc++-v3/include/bits/ranges_algo.h > b/libstdc++-v3/include/bits/ranges_algo.h > index 83eaa7da28b9..3590c501c4cd 100644 > --- a/libstdc++-v3/include/bits/ranges_algo.h > +++ b/libstdc++-v3/include/bits/ranges_algo.h > @@ -1454,7 +1454,7 @@ namespace ranges > if (!std::__invoke(__comp, > std::__invoke(__proj, *__dest), > std::__invoke(__proj, *__first))) > - *++__dest = std::move(*__first); > + *++__dest = ranges::iter_move(__first); > return {++__dest, __first}; > } > > diff --git a/libstdc++-v3/testsuite/25_algorithms/unique/120789.cc > b/libstdc++-v3/testsuite/25_algorithms/unique/120789.cc > new file mode 100644 > index 000000000000..24b107132473 > --- /dev/null > +++ b/libstdc++-v3/testsuite/25_algorithms/unique/120789.cc > @@ -0,0 +1,36 @@ > +// PR libstdc++/120789 - ranges::unique should use ranges::iter_move > +// { dg-do compile { target c++20 } } > + > +#include <algorithm> > + > +struct A > +{ > + bool operator==(const A&) const; > +}; > + > +struct B > +{ > + B(B&&) = delete; > + B& operator=(const A&) const; > + > + operator A() const; > + bool operator==(const B&) const; > +}; > + > +struct I > +{ > + using value_type = A; > + using difference_type = int; > + B operator*() const; > + I& operator++(); > + I operator++(int); > + bool operator==(const I&) const; > + friend A iter_move(const I&); > +}; > + > +void > +test01() > +{ > + std::ranges::subrange<I, I> r; > + auto [begin, end] = std::ranges::unique(r); > +} > -- > 2.50.0.131.gcf6f63ea6b > >