OK for trunk and backports.
On Fri, 27 Jun 2025 at 03:51, Patrick Palka <ppa...@redhat.com> wrote:
>
> PR libstdc++/120789
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/ranges_algo.h (__remove_if_fn::operator()): Use
> ranges::iter_move(iter) instead of std::move(*iter).
> * testsuite/25_algorithms/remove_if/120789.cc: New test.
> ---
> libstdc++-v3/include/bits/ranges_algo.h | 2 +-
> .../25_algorithms/remove_if/120789.cc | 36 +++++++++++++++++++
> 2 files changed, 37 insertions(+), 1 deletion(-)
> create mode 100644 libstdc++-v3/testsuite/25_algorithms/remove_if/120789.cc
>
> diff --git a/libstdc++-v3/include/bits/ranges_algo.h
> b/libstdc++-v3/include/bits/ranges_algo.h
> index 3590c501c4cd..7ef761f9c977 100644
> --- a/libstdc++-v3/include/bits/ranges_algo.h
> +++ b/libstdc++-v3/include/bits/ranges_algo.h
> @@ -1294,7 +1294,7 @@ namespace ranges
> for (; __first != __last; ++__first)
> if (!std::__invoke(__pred, std::__invoke(__proj, *__first)))
> {
> - *__result = std::move(*__first);
> + *__result = ranges::iter_move(__first);
> ++__result;
> }
>
> diff --git a/libstdc++-v3/testsuite/25_algorithms/remove_if/120789.cc
> b/libstdc++-v3/testsuite/25_algorithms/remove_if/120789.cc
> new file mode 100644
> index 000000000000..c1f4eeb9b4dd
> --- /dev/null
> +++ b/libstdc++-v3/testsuite/25_algorithms/remove_if/120789.cc
> @@ -0,0 +1,36 @@
> +// PR libstdc++/120789 - ranges::remove_if 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::remove_if(r, [](auto&&) { return true; });
> +}
> --
> 2.50.0.131.gcf6f63ea6b
>