1*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
2*e53c461bSKonstantin Varlamov //
3*e53c461bSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*e53c461bSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5*e53c461bSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e53c461bSKonstantin Varlamov //
7*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
8*e53c461bSKonstantin Varlamov 
9*e53c461bSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14, c++17
10*e53c461bSKonstantin Varlamov 
11*e53c461bSKonstantin Varlamov // std::ranges::lazy_split_view::outer-iterator::value_type::end()
12*e53c461bSKonstantin Varlamov 
13*e53c461bSKonstantin Varlamov #include <ranges>
14*e53c461bSKonstantin Varlamov 
15*e53c461bSKonstantin Varlamov #include <cassert>
16*e53c461bSKonstantin Varlamov #include "../types.h"
17*e53c461bSKonstantin Varlamov 
test()18*e53c461bSKonstantin Varlamov constexpr bool test() {
19*e53c461bSKonstantin Varlamov   // `View` is a forward range.
20*e53c461bSKonstantin Varlamov   {
21*e53c461bSKonstantin Varlamov     CopyableView input("a");
22*e53c461bSKonstantin Varlamov 
23*e53c461bSKonstantin Varlamov     // Non-const.
24*e53c461bSKonstantin Varlamov     {
25*e53c461bSKonstantin Varlamov       SplitViewCopyable v(input, "b");
26*e53c461bSKonstantin Varlamov       auto val = *v.begin();
27*e53c461bSKonstantin Varlamov 
28*e53c461bSKonstantin Varlamov       static_assert(std::same_as<decltype(val.end()), std::default_sentinel_t>);
29*e53c461bSKonstantin Varlamov       static_assert(noexcept(val.end()));
30*e53c461bSKonstantin Varlamov       [[maybe_unused]] auto e = val.end();
31*e53c461bSKonstantin Varlamov     }
32*e53c461bSKonstantin Varlamov 
33*e53c461bSKonstantin Varlamov     // Const.
34*e53c461bSKonstantin Varlamov     {
35*e53c461bSKonstantin Varlamov       SplitViewCopyable v(input, "b");
36*e53c461bSKonstantin Varlamov       const auto val = *v.begin();
37*e53c461bSKonstantin Varlamov 
38*e53c461bSKonstantin Varlamov       static_assert(std::same_as<decltype(val.end()), std::default_sentinel_t>);
39*e53c461bSKonstantin Varlamov       static_assert(noexcept(val.end()));
40*e53c461bSKonstantin Varlamov       [[maybe_unused]] auto e = val.end();
41*e53c461bSKonstantin Varlamov     }
42*e53c461bSKonstantin Varlamov   }
43*e53c461bSKonstantin Varlamov 
44*e53c461bSKonstantin Varlamov   // `View` is an input range.
45*e53c461bSKonstantin Varlamov   {
46*e53c461bSKonstantin Varlamov     InputView input("a");
47*e53c461bSKonstantin Varlamov 
48*e53c461bSKonstantin Varlamov     // Non-const.
49*e53c461bSKonstantin Varlamov     {
50*e53c461bSKonstantin Varlamov       SplitViewInput v(input, 'b');
51*e53c461bSKonstantin Varlamov       auto val = *v.begin();
52*e53c461bSKonstantin Varlamov 
53*e53c461bSKonstantin Varlamov       static_assert(std::same_as<decltype(val.end()), std::default_sentinel_t>);
54*e53c461bSKonstantin Varlamov       static_assert(noexcept(val.end()));
55*e53c461bSKonstantin Varlamov       [[maybe_unused]] auto e = val.end();
56*e53c461bSKonstantin Varlamov     }
57*e53c461bSKonstantin Varlamov 
58*e53c461bSKonstantin Varlamov     // Const.
59*e53c461bSKonstantin Varlamov     {
60*e53c461bSKonstantin Varlamov       SplitViewInput v(input, 'b');
61*e53c461bSKonstantin Varlamov       const auto val = *v.begin();
62*e53c461bSKonstantin Varlamov 
63*e53c461bSKonstantin Varlamov       static_assert(std::same_as<decltype(val.end()), std::default_sentinel_t>);
64*e53c461bSKonstantin Varlamov       static_assert(noexcept(val.end()));
65*e53c461bSKonstantin Varlamov       [[maybe_unused]] auto e = val.end();
66*e53c461bSKonstantin Varlamov     }
67*e53c461bSKonstantin Varlamov   }
68*e53c461bSKonstantin Varlamov 
69*e53c461bSKonstantin Varlamov   return true;
70*e53c461bSKonstantin Varlamov }
71*e53c461bSKonstantin Varlamov 
main(int,char **)72*e53c461bSKonstantin Varlamov int main(int, char**) {
73*e53c461bSKonstantin Varlamov   assert(test());
74*e53c461bSKonstantin Varlamov   static_assert(test());
75*e53c461bSKonstantin Varlamov 
76*e53c461bSKonstantin Varlamov   return 0;
77*e53c461bSKonstantin Varlamov }
78