On Fri, Jun 27, 2025 at 4:45 AM Patrick Palka <[email protected]> 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
>
>