1d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===//
2d8fad661SChristopher Di Bella //
3d8fad661SChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d8fad661SChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information.
5d8fad661SChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d8fad661SChristopher Di Bella //
7d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===//
8d8fad661SChristopher Di Bella 
9d8fad661SChristopher Di Bella // UNSUPPORTED: c++03, c++11, c++14, c++17
1071909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11d8fad661SChristopher Di Bella 
12f192616cSLouis Dionne // template<class R>
13d8fad661SChristopher Di Bella // concept input_range;
14d8fad661SChristopher Di Bella 
15d8fad661SChristopher Di Bella #include <ranges>
16d8fad661SChristopher Di Bella 
17d8fad661SChristopher Di Bella #include "test_iterators.h"
18d8fad661SChristopher Di Bella #include "test_range.h"
19d8fad661SChristopher Di Bella 
209d7c420aSLouis Dionne static_assert(std::ranges::input_range<test_range<cpp17_input_iterator> >);
219d7c420aSLouis Dionne static_assert(std::ranges::input_range<test_range<cpp17_input_iterator> const>);
22d8fad661SChristopher Di Bella 
239d7c420aSLouis Dionne static_assert(std::ranges::input_range<test_range<cpp20_input_iterator> >);
249d7c420aSLouis Dionne static_assert(std::ranges::input_range<test_range<cpp20_input_iterator> const>);
25d8fad661SChristopher Di Bella 
269d7c420aSLouis Dionne static_assert(std::ranges::input_range<test_non_const_range<cpp17_input_iterator> >);
279d7c420aSLouis Dionne static_assert(std::ranges::input_range<test_non_const_range<cpp20_input_iterator> >);
28d8fad661SChristopher Di Bella 
299d7c420aSLouis Dionne static_assert(!std::ranges::input_range<test_non_const_range<cpp17_input_iterator> const>);
309d7c420aSLouis Dionne static_assert(!std::ranges::input_range<test_non_const_range<cpp20_input_iterator> const>);
31d8fad661SChristopher Di Bella 
324a47ac7dSLouis Dionne static_assert(std::ranges::input_range<test_common_range<forward_iterator> >);
339d7c420aSLouis Dionne static_assert(!std::ranges::input_range<test_common_range<cpp20_input_iterator> >);
34d8fad661SChristopher Di Bella 
354a47ac7dSLouis Dionne static_assert(std::ranges::input_range<test_common_range<forward_iterator> const>);
369d7c420aSLouis Dionne static_assert(!std::ranges::input_range<test_common_range<cpp20_input_iterator> const>);
37d8fad661SChristopher Di Bella 
384a47ac7dSLouis Dionne static_assert(std::ranges::input_range<test_non_const_common_range<forward_iterator> >);
399d7c420aSLouis Dionne static_assert(!std::ranges::input_range<test_non_const_common_range<cpp20_input_iterator> >);
409d7c420aSLouis Dionne 
414a47ac7dSLouis Dionne static_assert(!std::ranges::input_range<test_non_const_common_range<forward_iterator> const>);
429d7c420aSLouis Dionne static_assert(!std::ranges::input_range<test_non_const_common_range<cpp20_input_iterator> const>);
43*bf150e8dSArthur O'Dwyer 
44*bf150e8dSArthur O'Dwyer // Test ADL-proofing.
45*bf150e8dSArthur O'Dwyer struct Incomplete;
46*bf150e8dSArthur O'Dwyer template<class T> struct Holder { T t; };
47*bf150e8dSArthur O'Dwyer 
48*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::input_range<Holder<Incomplete>*>);
49*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::input_range<Holder<Incomplete>*&>);
50*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::input_range<Holder<Incomplete>*&&>);
51*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::input_range<Holder<Incomplete>* const>);
52*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::input_range<Holder<Incomplete>* const&>);
53*bf150e8dSArthur O'Dwyer static_assert(!std::ranges::input_range<Holder<Incomplete>* const&&>);
54*bf150e8dSArthur O'Dwyer 
55*bf150e8dSArthur O'Dwyer static_assert( std::ranges::input_range<Holder<Incomplete>*[10]>);
56*bf150e8dSArthur O'Dwyer static_assert( std::ranges::input_range<Holder<Incomplete>*(&)[10]>);
57*bf150e8dSArthur O'Dwyer static_assert( std::ranges::input_range<Holder<Incomplete>*(&&)[10]>);
58*bf150e8dSArthur O'Dwyer static_assert( std::ranges::input_range<Holder<Incomplete>* const[10]>);
59*bf150e8dSArthur O'Dwyer static_assert( std::ranges::input_range<Holder<Incomplete>* const(&)[10]>);
60*bf150e8dSArthur O'Dwyer static_assert( std::ranges::input_range<Holder<Incomplete>* const(&&)[10]>);
61