diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv index 43282f357150c..0625dfe3a1d85 100644 --- a/libcxx/docs/Status/Cxx23Issues.csv +++ b/libcxx/docs/Status/Cxx23Issues.csv @@ -201,7 +201,7 @@ "`3677 `__","Is a cv-qualified ``pair`` specially handled in uses-allocator construction?", "November 2022","|Complete|","18.0","" "`3717 `__","``common_view::end`` should improve ``random_access_range`` case", "November 2022","","","|ranges|" "`3732 `__","``prepend_range`` and ``append_range`` can't be amortized constant time", "November 2022","|Nothing to do|","","|ranges|" -"`3736 `__","``move_iterator`` missing ``disable_sized_sentinel_for`` specialization", "November 2022","","","|ranges|" +"`3736 `__","``move_iterator`` missing ``disable_sized_sentinel_for`` specialization", "November 2022","|Complete|","19.0","|ranges|" "`3737 `__","``take_view::sentinel`` should provide ``operator-``", "November 2022","","","|ranges|" "`3738 `__","Missing preconditions for ``take_view`` constructor", "November 2022","|Complete|","16.0","|ranges|" "`3743 `__","``ranges::to``'s reserve may be ill-formed", "November 2022","","","|ranges|" diff --git a/libcxx/include/__iterator/move_iterator.h b/libcxx/include/__iterator/move_iterator.h index eefd5b3748454..6382c947060bf 100644 --- a/libcxx/include/__iterator/move_iterator.h +++ b/libcxx/include/__iterator/move_iterator.h @@ -330,6 +330,12 @@ operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterato } #endif // _LIBCPP_STD_VER >= 20 +#if _LIBCPP_STD_VER >= 20 +template + requires(!sized_sentinel_for<_Iter1, _Iter2>) +inline constexpr bool disable_sized_sentinel_for, move_iterator<_Iter2>> = true; +#endif // _LIBCPP_STD_VER >= 20 + template inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 move_iterator<_Iter> make_move_iterator(_Iter __i) { return move_iterator<_Iter>(std::move(__i)); diff --git a/libcxx/include/iterator b/libcxx/include/iterator index 5779bf828711b..1b9e7eaf0c1e8 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -475,6 +475,11 @@ constexpr move_iterator operator+( // constexpr in C++17 template // constexpr in C++17 constexpr move_iterator make_move_iterator(const Iterator& i); +template + requires (!sized_sentinel_for) + inline constexpr bool disable_sized_sentinel_for, // since C++20 + move_iterator> = true; + template class move_sentinel { public: diff --git a/libcxx/test/std/iterators/predef.iterators/move.iterators/sized_sentinel.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/move.iterators/sized_sentinel.compile.pass.cpp new file mode 100644 index 0000000000000..cb49086dd6802 --- /dev/null +++ b/libcxx/test/std/iterators/predef.iterators/move.iterators/sized_sentinel.compile.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +#include + +#include "test_iterators.h" + +using sized_it = random_access_iterator; +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for, std::move_iterator>); + +struct unsized_it { + using value_type = int; + using difference_type = std::ptrdiff_t; + + value_type& operator*() const; + bool operator==(const unsized_it&) const; + difference_type operator-(const unsized_it&) const { return 0; } +}; + +template <> +inline constexpr bool std::disable_sized_sentinel_for = true; + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for, std::move_iterator>);