1d31a2e75Szoecarver //===----------------------------------------------------------------------===//
2d31a2e75Szoecarver //
3d31a2e75Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d31a2e75Szoecarver // See https://llvm.org/LICENSE.txt for license information.
5d31a2e75Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d31a2e75Szoecarver //
7d31a2e75Szoecarver //===----------------------------------------------------------------------===//
8d31a2e75Szoecarver 
9d31a2e75Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
10*71909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11d31a2e75Szoecarver 
12d31a2e75Szoecarver // template<class T>
13d31a2e75Szoecarver // class empty_view;
14d31a2e75Szoecarver 
15d31a2e75Szoecarver #include <ranges>
16d31a2e75Szoecarver #include <cassert>
17d31a2e75Szoecarver 
18d31a2e75Szoecarver #include "test_macros.h"
19d31a2e75Szoecarver 
20d31a2e75Szoecarver template<class T>
testType()21d31a2e75Szoecarver constexpr void testType() {
22d31a2e75Szoecarver   static_assert(std::ranges::range<std::ranges::empty_view<T>>);
23d31a2e75Szoecarver   static_assert(std::ranges::range<const std::ranges::empty_view<T>>);
24d31a2e75Szoecarver   static_assert(std::ranges::view<std::ranges::empty_view<T>>);
25d31a2e75Szoecarver 
26d31a2e75Szoecarver   std::ranges::empty_view<T> empty;
27d31a2e75Szoecarver 
28d31a2e75Szoecarver   assert(empty.begin() == nullptr);
29d31a2e75Szoecarver   assert(empty.end() == nullptr);
30d31a2e75Szoecarver   assert(empty.data() == nullptr);
31d31a2e75Szoecarver   assert(empty.size() == 0);
32d31a2e75Szoecarver   assert(empty.empty() == true);
33d31a2e75Szoecarver 
34d31a2e75Szoecarver   assert(std::ranges::begin(empty) == nullptr);
35d31a2e75Szoecarver   assert(std::ranges::end(empty) == nullptr);
36d31a2e75Szoecarver   assert(std::ranges::data(empty) == nullptr);
37d31a2e75Szoecarver   assert(std::ranges::size(empty) == 0);
38d31a2e75Szoecarver   assert(std::ranges::empty(empty) == true);
39d31a2e75Szoecarver }
40d31a2e75Szoecarver 
41d31a2e75Szoecarver struct Empty {};
42d31a2e75Szoecarver struct BigType { char buff[8]; };
43d31a2e75Szoecarver 
44d31a2e75Szoecarver template<class T>
45d31a2e75Szoecarver concept ValidEmptyView = requires { typename std::ranges::empty_view<T>; };
46d31a2e75Szoecarver 
test()47d31a2e75Szoecarver constexpr bool test() {
48d31a2e75Szoecarver   // Not objects:
49d31a2e75Szoecarver   static_assert(!ValidEmptyView<int&>);
50d31a2e75Szoecarver   static_assert(!ValidEmptyView<void>);
51d31a2e75Szoecarver 
52d31a2e75Szoecarver   testType<int>();
53d31a2e75Szoecarver   testType<const int>();
54d31a2e75Szoecarver   testType<int*>();
55d31a2e75Szoecarver   testType<Empty>();
56d31a2e75Szoecarver   testType<const Empty>();
57d31a2e75Szoecarver   testType<BigType>();
58d31a2e75Szoecarver 
59d31a2e75Szoecarver   return true;
60d31a2e75Szoecarver }
61d31a2e75Szoecarver 
main(int,char **)62d31a2e75Szoecarver int main(int, char**) {
63d31a2e75Szoecarver   test();
64d31a2e75Szoecarver   static_assert(test());
65d31a2e75Szoecarver 
66d31a2e75Szoecarver   return 0;
67d31a2e75Szoecarver }
68