]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Use ranges::iter_move in ranges::remove_if [PR120789]
authorPatrick Palka <ppalka@redhat.com>
Tue, 1 Jul 2025 17:43:12 +0000 (13:43 -0400)
committerPatrick Palka <ppalka@redhat.com>
Tue, 1 Jul 2025 17:43:12 +0000 (13:43 -0400)
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>
libstdc++-v3/include/bits/ranges_algo.h
libstdc++-v3/testsuite/25_algorithms/remove_if/120789.cc [new file with mode: 0644]

index 7aea5c9fa70cc0b88656ac5a7c6e98fc50df14f3..cf369c5d4ddec1c1bb4f25f1099ae00d2161c180 100644 (file)
@@ -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 (file)
index 0000000..c1f4eeb
--- /dev/null
@@ -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; });
+}