//===----------------------------------------------------------------------===// // // 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 begin(); // constexpr auto begin() const requires forward_range && forward_range; #include #include #include #include "test_iterators.h" #include "test_range.h" #include "types.h" template concept ConstBeginDisabled = !requires (const View v) { { (*v.begin()) }; }; constexpr bool test() { // non-const: forward_range && simple-view -> outer-iterator // const: forward_range && forward_range -> outer-iterator { using V = ForwardView; using P = V; static_assert(std::ranges::forward_range); static_assert(std::ranges::forward_range); static_assert(simple_view); static_assert(simple_view

); { 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 && !simple-view -> outer-iterator // const: forward_range && forward_range -> outer-iterator { using V = ForwardDiffView; using P = V; static_assert(std::ranges::forward_range); static_assert(std::ranges::forward_range); static_assert(!simple_view); static_assert(!simple_view

); { 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 && !simple-view -> outer-iterator // const: forward_range && !forward_range -> disabled { using V = ForwardOnlyIfNonConstView; using P = V; static_assert(std::ranges::forward_range); static_assert(!std::ranges::forward_range); static_assert(!simple_view); static_assert(!simple_view

); std::ranges::lazy_split_view v; auto it = v.begin(); static_assert(std::is_same_v); static_assert(std::is_same_v); static_assert(ConstBeginDisabled); } // non-const: forward_range && simple-view && !simple-view -> outer-iterator // const: forward_range && forward_range -> outer-iterator { using V = ForwardView; using P = ForwardOnlyIfNonConstView; static_assert(std::ranges::forward_range); static_assert(std::ranges::forward_range); static_assert(simple_view); static_assert(!simple_view

); { 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 && tiny-range -> outer-iterator // const: !forward_range -> disabled { using V = InputView; using P = ForwardTinyView; static_assert(!std::ranges::forward_range); static_assert(std::ranges::forward_range

); std::ranges::lazy_split_view v; auto it = v.begin(); static_assert(std::is_same_v); static_assert(std::is_same_v); static_assert(ConstBeginDisabled); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }