diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 5ea901bf1f6..e872598d7d8 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -1731,6 +1731,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _GLIBCXX17_CONSTEXPR bool operator==(const move_iterator<_Iterator>& __x, const move_iterator<_Iterator>& __y) + // N.B. No contraints, x.base() == y.base() is always well-formed. { return __x.base() == __y.base(); } #ifdef __cpp_lib_three_way_comparison @@ -1791,6 +1792,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _GLIBCXX17_CONSTEXPR move_iterator<_Iterator> operator+(typename move_iterator<_Iterator>::difference_type __n, const move_iterator<_Iterator>& __x) +#ifdef __glibcxx_concepts + requires requires { { __x.base() + __n } -> same_as<_Iterator>; } +#endif { return __x + __n; } template diff --git a/libstdc++-v3/testsuite/24_iterators/move_iterator/rel_ops_c++20.cc b/libstdc++-v3/testsuite/24_iterators/move_iterator/rel_ops_c++20.cc index b2c1fe0e9f8..deb17722257 100644 --- a/libstdc++-v3/testsuite/24_iterators/move_iterator/rel_ops_c++20.cc +++ b/libstdc++-v3/testsuite/24_iterators/move_iterator/rel_ops_c++20.cc @@ -18,6 +18,7 @@ // { dg-do compile { target c++20 } } #include +#include template struct Iter @@ -141,3 +142,14 @@ static_assert( cend > beg ); static_assert( beg <= cend ); static_assert( cend >= beg ); static_assert( std::is_lt(beg <=> cend) ); + +template + concept has_plus = requires(std::iter_difference_t n, I i) { + { n + i } -> std::same_as; + }; + +using namespace __gnu_test; +using MBI = std::move_iterator>; +static_assert( ! has_plus ); +using MRI = std::move_iterator>; +static_assert( has_plus );