diff --git a/libcxx/include/__iterator/concepts.h b/libcxx/include/__iterator/concepts.h --- a/libcxx/include/__iterator/concepts.h +++ b/libcxx/include/__iterator/concepts.h @@ -96,6 +96,18 @@ input_or_output_iterator<_Ip> && __weakly_equality_comparable_with<_Sp, _Ip>; +template +inline constexpr bool disable_sized_sentinel_for = false; + +template +concept sized_sentinel_for = + sentinel_for<_Sp, _Ip> && + !disable_sized_sentinel_for, remove_cv_t<_Ip> > && + requires(const _Ip& __i, const _Sp& __s) { + { __s - __i } -> same_as >; + { __i - __s } -> same_as >; + }; + // clang-format on #endif // !defined(_LIBCPP_HAS_NO_RANGES) diff --git a/libcxx/include/iterator b/libcxx/include/iterator --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -68,6 +68,13 @@ template concept sentinel_for = see below; // since C++20 +// [iterator.concept.sizedsentinel], concept sized_sentinel_for +template + inline constexpr bool disable_sized_sentinel_for = false; + +template + concept sized_sentinel_for = see below; + template struct iterator @@ -458,6 +465,7 @@ #include <__iterator/iter_move.h> #include <__iterator/iterator_traits.h> #include <__iterator/readable_traits.h> +#include <__iterator/concepts.h> #include <__memory/addressof.h> #include <__memory/pointer_traits.h> #include diff --git a/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/map/iterator_concept_conformance.compile.pass.cpp @@ -30,6 +30,8 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_readable); static_assert(!std::indirectly_writable); @@ -39,3 +41,5 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multimap/iterator_concept_conformance.compile.pass.cpp @@ -30,6 +30,8 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_readable); static_assert(!std::indirectly_writable); @@ -39,3 +41,5 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multiset/iterator_concept_conformance.compile.pass.cpp @@ -30,6 +30,8 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_readable); static_assert(!std::indirectly_writable); @@ -37,3 +39,5 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/set/iterator_concept_conformance.compile.pass.cpp @@ -30,6 +30,8 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_readable); static_assert(!std::indirectly_writable); @@ -39,3 +41,5 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/iterator_concept_conformance.compile.pass.cpp @@ -38,3 +38,23 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); + +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/deque/iterator_concept_conformance.compile.pass.cpp @@ -39,3 +39,23 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); + +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.iter/iterator_concept_conformance.compile.pass.cpp @@ -26,6 +26,8 @@ static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_readable); static_assert(!std::indirectly_writable); @@ -33,3 +35,5 @@ static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector.bool/iterator_concept_conformance.compile.pass.cpp @@ -39,3 +39,23 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); + +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/iterator_concept_conformance.compile.pass.cpp @@ -39,3 +39,23 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); + +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/iterator_concept_conformance.compile.pass.cpp @@ -54,3 +54,8 @@ static_assert(!std::sentinel_for); static_assert(std::sentinel_for); static_assert(std::sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multimap/iterator_concept_conformance.compile.pass.cpp @@ -57,3 +57,8 @@ static_assert(!std::sentinel_for); static_assert(std::sentinel_for); static_assert(std::sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); \ No newline at end of file diff --git a/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multiset/iterator_concept_conformance.compile.pass.cpp @@ -57,3 +57,8 @@ static_assert(!std::sentinel_for); static_assert(std::sentinel_for); static_assert(std::sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/views/span.iterators/iterator_concept_conformance.compile.pass.cpp @@ -26,3 +26,5 @@ static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.directory_iterator/iterator_concept_conformance.compile.pass.cpp @@ -22,6 +22,7 @@ static_assert(!std::incrementable); static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); static_assert(std::indirectly_readable); static_assert( @@ -30,3 +31,4 @@ static_assert(!std::incrementable); static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.sentinel/sized_sentinel_for.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.sentinel/sized_sentinel_for.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.sentinel/sized_sentinel_for.compile.pass.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// [iterator.concept.sizedsentinel], concept sized_sentinel_for +// +// template +// inline constexpr bool disable_sized_sentinel_for = false; +// +// template +// concept sized_sentinel_for = see below; + +#include + +#include +#include +#include +#include +#include +#include + +#include "test_iterators.h" +#include "test_macros.h" + +static_assert(std::sized_sentinel_for, random_access_iterator >); +static_assert(!std::sized_sentinel_for, bidirectional_iterator >); + +struct int_sized_sentinel { + friend bool operator==(int_sized_sentinel, int*); + friend long operator-(int_sized_sentinel, int*); + friend long operator-(int*, int_sized_sentinel); +}; +static_assert(std::sized_sentinel_for); +// int_sized_sentinel is not an iterator. +static_assert(!std::sized_sentinel_for); + +struct no_default_ctor { + no_default_ctor() = delete; + bool operator==(std::input_or_output_iterator auto) const; +}; +static_assert(!std::sized_sentinel_for); + +struct not_copyable { + not_copyable() = default; + not_copyable(not_copyable const&) = delete; + bool operator==(std::input_or_output_iterator auto) const; +}; +static_assert(!std::sized_sentinel_for); + +struct double_sized_sentinel { + friend bool operator==(double_sized_sentinel, double*); + friend int operator-(double_sized_sentinel, double*); + friend int operator-(double*, double_sized_sentinel); +}; +template <> +inline constexpr bool std::disable_sized_sentinel_for = true; + +static_assert(!std::sized_sentinel_for); + +struct only_one_sub_op { + friend bool operator==(only_one_sub_op, std::input_or_output_iterator auto); + friend long operator-(only_one_sub_op, std::input_or_output_iterator auto); +}; +static_assert(!std::sized_sentinel_for); + +struct wrong_return_type { + friend bool operator==(wrong_return_type, std::input_or_output_iterator auto); + friend long operator-(wrong_return_type, std::input_or_output_iterator auto); + friend void operator-(std::input_or_output_iterator auto, wrong_return_type); +}; +static_assert(!std::sized_sentinel_for); + +// Standard types +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -22,3 +22,4 @@ static_assert(!std::weakly_incrementable); static_assert(!std::input_or_output_iterator); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -22,3 +22,4 @@ static_assert(!std::weakly_incrementable); static_assert(!std::input_or_output_iterator); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/move.iterators/move.iterator/iterator_concept_conformance.compile.pass.cpp @@ -20,3 +20,4 @@ static_assert(std::incrementable); static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); +static_assert(std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istream.iterator/iterator_concept_conformance.compile.pass.cpp @@ -22,3 +22,4 @@ static_assert(std::incrementable); static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/iterator_concept_conformance.compile.pass.cpp @@ -24,3 +24,4 @@ static_assert(!std::incrementable); static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp @@ -22,3 +22,4 @@ static_assert(!std::weakly_incrementable); static_assert(!std::input_or_output_iterator); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp @@ -23,3 +23,4 @@ static_assert(!std::weakly_incrementable); static_assert(!std::input_or_output_iterator); static_assert(!std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/re/re.iter/re.regiter/iterator_concept_conformance.compile.pass.cpp @@ -21,3 +21,4 @@ static_assert(std::incrementable); static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/re/re.iter/re.tokiter/iterator_concept_conformance.compile.pass.cpp @@ -21,3 +21,4 @@ static_assert(std::incrementable); static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); +static_assert(!std::sized_sentinel_for); diff --git a/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.iterators/iterator_concept_conformance.compile.pass.cpp @@ -38,3 +38,23 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); + +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); diff --git a/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/strings/string.view/string.view.iterators/iterator_concept_conformance.compile.pass.cpp @@ -38,3 +38,23 @@ static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); + +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); + +static_assert(!std::sized_sentinel_for); +static_assert(!std::sized_sentinel_for); +static_assert(std::sized_sentinel_for); +static_assert(std::sized_sentinel_for);