10f4b41e0Szoecarver //===----------------------------------------------------------------------===//
20f4b41e0Szoecarver //
30f4b41e0Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40f4b41e0Szoecarver // See https://llvm.org/LICENSE.txt for license information.
50f4b41e0Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60f4b41e0Szoecarver //
70f4b41e0Szoecarver //===----------------------------------------------------------------------===//
80f4b41e0Szoecarver 
90f4b41e0Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
100f4b41e0Szoecarver // UNSUPPORTED: libcpp-has-no-incomplete-ranges
110f4b41e0Szoecarver 
120f4b41e0Szoecarver // sentinel() = default;
130f4b41e0Szoecarver // constexpr explicit sentinel(sentinel_t<Base> end);
140f4b41e0Szoecarver // constexpr sentinel(sentinel<!Const> s)
150f4b41e0Szoecarver //   requires Const && convertible_to<sentinel_t<V>, sentinel_t<Base>>;
160f4b41e0Szoecarver 
170f4b41e0Szoecarver #include <ranges>
180f4b41e0Szoecarver #include <cassert>
190f4b41e0Szoecarver 
200f4b41e0Szoecarver #include "test_macros.h"
210f4b41e0Szoecarver #include "test_iterators.h"
220f4b41e0Szoecarver #include "../types.h"
230f4b41e0Szoecarver 
test()240f4b41e0Szoecarver constexpr bool test() {
250f4b41e0Szoecarver   int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
260f4b41e0Szoecarver 
270f4b41e0Szoecarver   {
280f4b41e0Szoecarver     {
29*610ac8dbSArthur O'Dwyer       const std::ranges::take_view<MoveOnlyView> tv(MoveOnlyView{buffer}, 4);
300f4b41e0Szoecarver       assert(tv.end() == std::ranges::next(tv.begin(), 4));
310f4b41e0Szoecarver       assert(std::ranges::next(tv.begin(), 4) == tv.end());
320f4b41e0Szoecarver     }
330f4b41e0Szoecarver 
340f4b41e0Szoecarver     {
35*610ac8dbSArthur O'Dwyer       std::ranges::take_view<MoveOnlyView> tv(MoveOnlyView{buffer}, 4);
360f4b41e0Szoecarver       assert(tv.end() == std::ranges::next(tv.begin(), 4));
370f4b41e0Szoecarver       assert(std::ranges::next(tv.begin(), 4) == tv.end());
380f4b41e0Szoecarver     }
390f4b41e0Szoecarver   }
400f4b41e0Szoecarver 
410f4b41e0Szoecarver   {
42*610ac8dbSArthur O'Dwyer     std::ranges::take_view<MoveOnlyView> tvNonConst(MoveOnlyView{buffer}, 4);
43*610ac8dbSArthur O'Dwyer     const std::ranges::take_view<MoveOnlyView> tvConst(MoveOnlyView{buffer}, 4);
440f4b41e0Szoecarver     assert(tvNonConst.end() == std::ranges::next(tvConst.begin(), 4));
450f4b41e0Szoecarver     assert(std::ranges::next(tvConst.begin(), 4) == tvNonConst.end());
460f4b41e0Szoecarver   }
470f4b41e0Szoecarver 
480f4b41e0Szoecarver   return true;
490f4b41e0Szoecarver }
500f4b41e0Szoecarver 
main(int,char **)510f4b41e0Szoecarver int main(int, char**) {
520f4b41e0Szoecarver   test();
530f4b41e0Szoecarver   static_assert(test());
540f4b41e0Szoecarver 
550f4b41e0Szoecarver   return 0;
560f4b41e0Szoecarver }
57