diff options
author | Patrick Palka <ppalka@redhat.com> | 2025-07-01 13:43:09 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2025-07-01 13:43:09 -0400 |
commit | 6f69a68998f601cdb86c65113eb1feddfa9da31a (patch) | |
tree | a4ce7c1c4b1513a604ef0ad7e502a393143c2958 | |
parent | f5282f7402939fdec910ef3743d38edac864eec8 (diff) | |
download | gcc-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.h | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/unique/120789.cc | 36 |
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); +} |