//===----------------------------------------------------------------------===// // // 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 // constexpr auto end() requires forward_range && common_range; // constexpr auto end() const; #include #include #include #include "test_iterators.h" #include "test_range.h" #include "types.h" struct ForwardViewCommonIfConst : std::ranges::view_base { std::string_view view_; constexpr explicit ForwardViewCommonIfConst() = default; constexpr ForwardViewCommonIfConst(const char* ptr) : view_(ptr) {} constexpr ForwardViewCommonIfConst(std::string_view v) : view_(v) {} constexpr ForwardViewCommonIfConst(ForwardViewCommonIfConst&&) = default; constexpr ForwardViewCommonIfConst& operator=(ForwardViewCommonIfConst&&) = default; constexpr ForwardViewCommonIfConst(const ForwardViewCommonIfConst&) = default; constexpr ForwardViewCommonIfConst& operator=(const ForwardViewCommonIfConst&) = default; constexpr forward_iterator begin() { return forward_iterator(nullptr); } constexpr std::default_sentinel_t end() { return std::default_sentinel; } constexpr forward_iterator begin() const { return forward_iterator(view_.begin()); } constexpr forward_iterator end() const { return forward_iterator(view_.end()); } }; bool operator==(forward_iterator, std::default_sentinel_t) { return false; } struct ForwardViewNonCommonRange : std::ranges::view_base { std::string_view view_; constexpr explicit ForwardViewNonCommonRange() = default; constexpr ForwardViewNonCommonRange(const char* ptr) : view_(ptr) {} constexpr ForwardViewNonCommonRange(std::string_view v) : view_(v) {} constexpr ForwardViewNonCommonRange(ForwardViewNonCommonRange&&) = default; constexpr ForwardViewNonCommonRange& operator=(ForwardViewNonCommonRange&&) = default; constexpr ForwardViewNonCommonRange(const ForwardViewNonCommonRange&) = default; constexpr ForwardViewNonCommonRange& operator=(const ForwardViewNonCommonRange&) = default; constexpr forward_iterator begin() { return forward_iterator(nullptr); } constexpr std::default_sentinel_t end() { return std::default_sentinel; } constexpr forward_iterator begin() const { return forward_iterator(view_.begin()); } constexpr std::default_sentinel_t end() const { return std::default_sentinel; } }; bool operator==(forward_iterator, std::default_sentinel_t) { return false; } constexpr bool test() { // non-const: forward_range && simple_view && simple_view

-> outer-iterator // const: forward_range && common_range -> outer-iterator { using V = ForwardView; using P = V; static_assert(std::ranges::forward_range); static_assert(std::ranges::common_range); static_assert(simple_view); static_assert(simple_view

); { std::ranges::lazy_split_view v; auto it = v.end(); static_assert(std::is_same_v); static_assert(std::is_same_v); } { const std::ranges::lazy_split_view cv; auto it = cv.end(); static_assert(std::is_same_v); static_assert(std::is_same_v); } } // non-const: forward_range && common_range && simple_view && !simple_view

-> outer-iterator // const: forward_range && forward_range && common_range -> outer-iterator { using V = ForwardView; using P = ForwardDiffView; static_assert(std::ranges::forward_range); static_assert(std::ranges::common_range); static_assert(simple_view); static_assert(!simple_view

); static_assert(std::ranges::forward_range); static_assert(std::ranges::common_range); { std::ranges::lazy_split_view v; auto it = v.end(); static_assert(std::is_same_v); static_assert(std::is_same_v); } { const std::ranges::lazy_split_view cv; auto it = cv.end(); static_assert(std::is_same_v); static_assert(std::is_same_v); } } // non-const: forward_range && !common_range -> disabled // const: forward_range && forward_range && common_range -> outer-iterator { using V = ForwardViewCommonIfConst; using P = V; static_assert(std::ranges::forward_range); static_assert(!std::ranges::common_range); static_assert(std::ranges::forward_range); static_assert(std::ranges::common_range); { std::ranges::lazy_split_view v; auto it = v.begin(); static_assert(std::is_same_v); static_assert(std::is_same_v); } { const std::ranges::lazy_split_view cv; auto it = cv.begin(); static_assert(std::is_same_v); static_assert(std::is_same_v); } } // non-const: forward_range && !common_range -> disabled // const: forward_range && forward_range && !common_range -> outer-iterator { using V = ForwardViewNonCommonRange; using P = V; static_assert(std::ranges::forward_range); static_assert(!std::ranges::common_range); static_assert(std::ranges::forward_range); static_assert(!std::ranges::common_range); { std::ranges::lazy_split_view v; auto it = v.end(); static_assert(std::same_as); } { const std::ranges::lazy_split_view cv; auto it = cv.end(); static_assert(std::same_as); } } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }