aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2025-07-01 13:43:09 -0400
committerPatrick Palka <ppalka@redhat.com>2025-07-01 13:43:09 -0400
commit6f69a68998f601cdb86c65113eb1feddfa9da31a (patch)
treea4ce7c1c4b1513a604ef0ad7e502a393143c2958
parentf5282f7402939fdec910ef3743d38edac864eec8 (diff)
downloadgcc-6f69a68998f601cdb86c65113eb1feddfa9da31a.zip
gcc-6f69a68998f601cdb86c65113eb1feddfa9da31a.tar.gz
gcc-6f69a68998f601cdb86c65113eb1feddfa9da31a.tar.bz2
libstdc++: Use ranges::iter_move in ranges::unique [PR120789]
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. Reviewed-by: Tomasz KamiƄski <tkaminsk@redhat.com> Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
-rw-r--r--libstdc++-v3/include/bits/ranges_algo.h2
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/unique/120789.cc36
2 files changed, 37 insertions, 1 deletions
diff --git a/libstdc++-v3/include/bits/ranges_algo.h b/libstdc++-v3/include/bits/ranges_algo.h
index 2df730e..7aea5c9 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 0000000..24b1071
--- /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);
+}