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
>
>

Reply via email to