From: Christopher Di Bella Date: Sun, 11 Apr 2021 22:11:03 +0000 (+0000) Subject: [libcxx][iterator][ranges] adds `forward_iterator` and `forward_range` X-Git-Tag: llvmorg-14-init~7756 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fa3e26266cd499856c573b68bee97fefc07f24ad;p=platform%2Fupstream%2Fllvm.git [libcxx][iterator][ranges] adds `forward_iterator` and `forward_range` Implements parts of: * P0896R4 The One Ranges Proposal` Depends on D100271. Differential Revision: https://reviews.llvm.org/D100275 --- diff --git a/libcxx/include/__iterator/concepts.h b/libcxx/include/__iterator/concepts.h index 9ea1d16..3e6022b 100644 --- a/libcxx/include/__iterator/concepts.h +++ b/libcxx/include/__iterator/concepts.h @@ -119,6 +119,14 @@ concept input_iterator = requires { typename _ITER_CONCEPT<_Ip>; } && derived_from<_ITER_CONCEPT<_Ip>, input_iterator_tag>; +// [iterator.concept.forward] +template +concept forward_iterator = + input_iterator<_Ip> && + derived_from<_ITER_CONCEPT<_Ip>, forward_iterator_tag> && + incrementable<_Ip> && + sentinel_for<_Ip, _Ip>; + // clang-format on #endif // !defined(_LIBCPP_HAS_NO_RANGES) diff --git a/libcxx/include/__ranges/concepts.h b/libcxx/include/__ranges/concepts.h index 8f2f467..36e6739 100644 --- a/libcxx/include/__ranges/concepts.h +++ b/libcxx/include/__ranges/concepts.h @@ -55,7 +55,11 @@ namespace ranges { concept input_range = range<_Tp> && input_iterator >; template + concept forward_range = input_range<_Tp> && forward_iterator >; + + template concept common_range = range<_Tp> && same_as, sentinel_t<_Tp> >; + } // namespace ranges #endif // !defined(_LIBCPP_HAS_NO_RANGES) diff --git a/libcxx/include/iterator b/libcxx/include/iterator index d759eae..78f67dd 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -79,6 +79,10 @@ template template concept input_iterator = see below; // since C++20 +// [iterator.concept.forward], concept forward_iterator +template + concept forward_iterator = see below; // since C++20 + template struct iterator diff --git a/libcxx/include/ranges b/libcxx/include/ranges index ca9f648..58b67f1 100644 --- a/libcxx/include/ranges +++ b/libcxx/include/ranges @@ -51,6 +51,9 @@ namespace std::ranges { template concept input_range = see below; + template + concept forward_range = see below; + template concept common_range = see below; } 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 index 576118f..a833200 100644 --- 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 @@ -22,10 +22,8 @@ using reverse_iterator = std::map::reverse_iterator; using const_reverse_iterator = std::map::const_reverse_iterator; using value_type = std::pair; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,12 +32,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); diff --git a/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp index 7a9e34c..998227d 100644 --- a/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index ab74dfc..1693fa0 100644 --- 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 @@ -22,10 +22,8 @@ using reverse_iterator = std::multimap::reverse_iterator; using const_reverse_iterator = std::multimap::const_reverse_iterator; using value_type = std::pair; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,12 +32,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); diff --git a/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp index 45c422f..dde9ba1 100644 --- a/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 0487700..1c88b55 100644 --- 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 @@ -22,10 +22,8 @@ using reverse_iterator = std::multiset::reverse_iterator; using const_reverse_iterator = std::multiset::const_reverse_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,11 +32,10 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); +static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); diff --git a/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp index eb97b28..b5c8e24 100644 --- a/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 55539b4..f5f92a9 100644 --- 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 @@ -22,10 +22,8 @@ using reverse_iterator = std::set::reverse_iterator; using const_reverse_iterator = std::set::const_reverse_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,12 +32,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::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 index 6eec057..846c0e3 100644 --- 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 @@ -21,10 +21,8 @@ using const_iterator = std::array::const_iterator; using reverse_iterator = std::array::reverse_iterator; using const_reverse_iterator = std::array::const_reverse_iterator; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,10 +32,8 @@ static_assert(std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -46,4 +42,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp index 05ed9e1..cdb245b 100644 --- a/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index a401e2d..d5d455e 100644 --- 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 @@ -22,10 +22,8 @@ using reverse_iterator = std::deque::reverse_iterator; using const_reverse_iterator = std::deque::const_reverse_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -35,10 +33,8 @@ static_assert(std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -47,4 +43,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp index 881e823..afb7677 100644 --- a/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 9b7d36f..fae2648 100644 --- 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 @@ -20,22 +20,16 @@ using iterator = std::forward_list::iterator; using const_iterator = std::forward_list::const_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(std::indirectly_writable); -static_assert(std::incrementable); -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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -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::input_iterator); diff --git a/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp index 5203a23..19fe353 100644 --- a/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); diff --git a/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp index 8566ec9..e2b60ce 100644 --- a/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/list/iterator_concept_conformance.compile.pass.cpp @@ -22,10 +22,8 @@ using reverse_iterator = std::list::reverse_iterator; using const_reverse_iterator = std::list::const_reverse_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,12 +32,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -48,4 +43,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp index abb58f5..c831850 100644 --- a/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 7aa8cb4..3320317 100644 --- 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 @@ -22,10 +22,8 @@ using reverse_iterator = std::vector::reverse_iterator; using const_reverse_iterator = std::vector::const_reverse_iterator; using value_type = bool; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -35,10 +33,8 @@ static_assert(std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -47,4 +43,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp index d00394d..3fe82de 100644 --- a/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index c72eee7..8f67670 100644 --- 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 @@ -22,10 +22,8 @@ using reverse_iterator = std::vector::reverse_iterator; using const_reverse_iterator = std::vector::const_reverse_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -35,10 +33,8 @@ static_assert(std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::sized_sentinel_for); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -47,4 +43,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp index 425d516..ab80054 100644 --- a/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 58311bd..1bc67b2 100644 --- 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 @@ -22,10 +22,8 @@ using local_iterator = std::unordered_map::local_iterator; using const_local_iterator = std::unordered_map::const_local_iterator; using value_type = std::pair; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,12 +32,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -48,12 +43,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); @@ -62,12 +54,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); @@ -76,4 +65,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp index d3b98a7..a62ca69 100644 --- a/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 8033a91..a53edc9 100644 --- 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 @@ -22,10 +22,8 @@ using local_iterator = std::unordered_multimap::local_iterator; using const_local_iterator = std::unordered_multimap::const_local_iterator; using value_type = std::pair; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,12 +32,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -48,12 +43,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); @@ -62,12 +54,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); @@ -76,4 +65,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp index 4f0e403..2418b0f 100644 --- a/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 5a0cfb5..c1b05fe 100644 --- 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 @@ -22,10 +22,8 @@ using local_iterator = std::unordered_multiset::local_iterator; using const_local_iterator = std::unordered_multiset::const_local_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -34,12 +32,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); @@ -48,12 +43,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); @@ -62,12 +54,9 @@ 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); @@ -76,4 +65,3 @@ 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::input_iterator); diff --git a/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp index 9d42fb7..8d34570 100644 --- a/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); diff --git a/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp index 447b3eb..01e36e1 100644 --- a/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/iterator_concept_conformance.compile.pass.cpp @@ -22,39 +22,45 @@ using local_iterator = std::unordered_set::local_iterator; using const_local_iterator = std::unordered_set::const_local_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(std::sentinel_for); static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); -static_assert(std::input_iterator); +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::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); static_assert(std::sentinel_for); +static_assert(std::sentinel_for); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); -static_assert(std::input_iterator); +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::indirectly_readable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); +static_assert(std::forward_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); static_assert(std::sentinel_for); -static_assert(std::input_iterator); +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::indirectly_readable); +static_assert(std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::incrementable); -static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sentinel_for); static_assert(std::sentinel_for); static_assert(std::sentinel_for); -static_assert(std::input_iterator); +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.set/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp index 7806ce0..e792ce0 100644 --- a/libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); diff --git a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp index a94cdbf..53f4e90 100644 --- a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp @@ -22,8 +22,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, range::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); 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 index 5e0f16a..55d5c38 100644 --- 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 @@ -20,12 +20,9 @@ using iterator = std::span::iterator; using reverse_iterator = std::span::reverse_iterator; using value_type = int; -static_assert(std::indirectly_readable); +static_assert(std::forward_iterator); static_assert(std::indirectly_writable); -static_assert(std::incrementable); -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::input_iterator); 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 index 6c3ee5a..63ab32c 100644 --- 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 @@ -18,20 +18,16 @@ using value_type = fs::directory_entry; -static_assert(std::indirectly_readable); +static_assert(std::input_iterator); +static_assert(!std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::weakly_incrementable); 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::input_iterator); -static_assert(std::indirectly_readable); +static_assert(std::input_iterator); +static_assert(!std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::weakly_incrementable); 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::input_iterator); diff --git a/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp index 3cb551a..6f22e25 100644 --- a/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp @@ -21,8 +21,8 @@ namespace stdr = std::ranges; static_assert(std::same_as, fs::path::iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); static_assert(std::same_as, fs::path::const_iterator>); static_assert(stdr::common_range); -static_assert(stdr::input_range); +static_assert(stdr::forward_range); diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/forward_iterator.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/forward_iterator.compile.pass.cpp new file mode 100644 index 0000000..61eb3ea --- /dev/null +++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/forward_iterator.compile.pass.cpp @@ -0,0 +1,89 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// std::forward_iterator; + +#include + +#include + +#include "test_iterators.h" + +static_assert(!std::forward_iterator >); +static_assert(!std::forward_iterator >); +static_assert(std::forward_iterator >); +static_assert(std::forward_iterator >); +static_assert(std::forward_iterator >); +static_assert(std::forward_iterator >); + +static_assert(std::forward_iterator); +static_assert(std::forward_iterator); +static_assert(std::forward_iterator); +static_assert(std::forward_iterator); + +struct not_input_iterator { + // using value_type = int; + using difference_type = std::ptrdiff_t; + using iterator_concept = std::forward_iterator_tag; + + int operator*() const; + + not_input_iterator& operator++(); + not_input_iterator operator++(int); + + bool operator==(not_input_iterator const&) const = default; +}; +static_assert(std::input_or_output_iterator); +static_assert(!std::input_iterator); +static_assert(!std::forward_iterator); + +struct bad_iterator_tag { + using value_type = int; + using difference_type = std::ptrdiff_t; + using iterator_concept = std::input_iterator_tag; + + int operator*() const; + + bad_iterator_tag& operator++(); + bad_iterator_tag operator++(int); + + bool operator==(bad_iterator_tag const&) const = default; +}; +static_assert(!std::forward_iterator); + +struct not_incrementable { + using value_type = int; + using difference_type = std::ptrdiff_t; + using iterator_concept = std::forward_iterator_tag; + + int operator*() const; + + not_incrementable& operator++(); + void operator++(int); + + bool operator==(not_incrementable const&) const = default; +}; +static_assert(!std::forward_iterator); + +struct not_equality_comparable { + using value_type = int; + using difference_type = std::ptrdiff_t; + using iterator_concept = std::forward_iterator_tag; + + int operator*() const; + + not_equality_comparable& operator++(); + not_equality_comparable operator++(int); + + bool operator==(not_equality_comparable const&) const = delete; +}; +static_assert(!std::forward_iterator); diff --git a/libcxx/test/libcxx/iterators/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/subsumption.compile.pass.cpp similarity index 78% rename from libcxx/test/libcxx/iterators/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp rename to libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/subsumption.compile.pass.cpp index 41c7c7e..f1b7f30 100644 --- a/libcxx/test/libcxx/iterators/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp +++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.forward/subsumption.compile.pass.cpp @@ -10,22 +10,19 @@ // UNSUPPORTED: libcpp-no-concepts // UNSUPPORTED: gcc-10 -// template -// concept input_iterator; +// std::forward_iterator; #include #include // clang-format off -template -requires std::indirectly_readable && - std::derived_from, std::input_iterator_tag> +template [[nodiscard]] constexpr bool check_subsumption() { return false; } -template +template [[nodiscard]] constexpr bool check_subsumption() { return true; } diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp index 3a18b8a..608a7d0 100644 --- a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp +++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp @@ -1 +1,33 @@ -// Due to the need to check _ITER_CONCEPT, this test is located in `test/libcxx/iterators/iterator.concepts/iterator.concept.input/subsumption.compile.pass.cpp`. +//===----------------------------------------------------------------------===// +// +// 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 + +// template +// concept input_iterator; + +#include + +#include + +// clang-format off +template +requires std::indirectly_readable +[[nodiscard]] constexpr bool check_subsumption() { + return false; +} + +template +[[nodiscard]] constexpr bool check_subsumption() { + return true; +} +// clang-format on + +static_assert(check_subsumption()); 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 index 185f04b..e239ce1 100644 --- 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 @@ -15,10 +15,11 @@ #include using iterator = std::move_iterator; -static_assert(std::indirectly_readable); + + +static_assert(std::input_iterator); +static_assert(!std::forward_iterator); static_assert(!std::indirectly_writable); 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::input_iterator); diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp index ea8d020..4144617 100644 --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/iterator_concept_conformance.compile.pass.cpp @@ -14,16 +14,28 @@ #include -using iterator = std::reverse_iterator; - -static_assert(std::indirectly_readable); -static_assert(std::indirectly_writable); -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::input_iterator); - -using other_iterator = std::reverse_iterator; -static_assert(std::sentinel_for); -static_assert(!std::sized_sentinel_for); +#include "test_iterators.h" + +template +[[nodiscard]] consteval bool common_reverse_iterator_checks() { + static_assert(std::indirectly_writable); + static_assert(std::sentinel_for); + static_assert(std::sentinel_for>); + static_assert(!std::sized_sentinel_for>); + return true; +} + +using reverse_bidirectional_iterator = std::reverse_iterator>; +static_assert(common_reverse_iterator_checks()); +static_assert(std::forward_iterator); +static_assert(!std::sized_sentinel_for); + +using reverse_random_access_iterator = std::reverse_iterator>; +static_assert(common_reverse_iterator_checks()); +static_assert(std::forward_iterator); +static_assert(std::sized_sentinel_for); + +using reverse_contiguous_iterator = std::reverse_iterator>; +static_assert(common_reverse_iterator_checks()); +static_assert(std::forward_iterator); +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 index e953563..765d5b2 100644 --- 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 @@ -18,11 +18,10 @@ #include using iterator = std::istreambuf_iterator; -static_assert(std::indirectly_readable); + +static_assert(std::input_iterator); +static_assert(!std::forward_iterator); static_assert(!std::indirectly_writable); -static_assert(std::weakly_incrementable); 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::input_iterator); diff --git a/libcxx/test/std/ranges/range.refinements/forward_range.compile.pass.cpp b/libcxx/test/std/ranges/range.refinements/forward_range.compile.pass.cpp new file mode 100644 index 0000000..1a58f1fa --- /dev/null +++ b/libcxx/test/std/ranges/range.refinements/forward_range.compile.pass.cpp @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// std::ranges::forward_range; + +#include + +#include "test_iterators.h" +#include "test_range.h" + +namespace stdr = std::ranges; + +template