[gcc r14-12706] libstdc++: Use ranges::iter_move in ranges::remove_if [PR120789]
Patrick Palka
ppalka@gcc.gnu.org
Sat Jun 27 20:09:12 GMT 2026
https://gcc.gnu.org/g:1b7d2aefd5f3f9425c1611b0a5944460a7479fb1
commit r14-12706-g1b7d2aefd5f3f9425c1611b0a5944460a7479fb1
Author: Patrick Palka <ppalka@redhat.com>
Date: Tue Jul 1 13:43:12 2025 -0400
libstdc++: Use ranges::iter_move in ranges::remove_if [PR120789]
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.
Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
(cherry picked from commit 17e9ae215f991f2f94fe480aee2404c508388b7c)
Diff:
---
libstdc++-v3/include/bits/ranges_algo.h | 2 +-
.../testsuite/25_algorithms/remove_if/120789.cc | 36 ++++++++++++++++++++++
2 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h
index f8168e6a7ff4..7ce98926a75b 100644
--- a/libstdc++-v3/include/bits/ranges_algo.h
+++ b/libstdc++-v3/include/bits/ranges_algo.h
@@ -990,7 +990,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; });
+}
More information about the Libstdc++-cvs
mailing list