1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10 // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11 
12 // iterator() = default;
13 
14 #include <ranges>
15 #include <tuple>
16 
17 #include "../types.h"
18 
19 struct PODIter {
20   int i; // deliberately uninitialised
21 
22   using iterator_category = std::random_access_iterator_tag;
23   using value_type = int;
24   using difference_type = intptr_t;
25 
operator *PODIter26   constexpr int operator*() const { return i; }
27 
operator ++PODIter28   constexpr PODIter& operator++() { return *this; }
operator ++PODIter29   constexpr void operator++(int) {}
30 
31   friend constexpr bool operator==(const PODIter&, const PODIter&) = default;
32 };
33 
34 struct IterDefaultCtrView : std::ranges::view_base {
35   PODIter begin() const;
36   PODIter end() const;
37 };
38 
39 struct IterNoDefaultCtrView : std::ranges::view_base {
40   cpp20_input_iterator<int*> begin() const;
41   sentinel_wrapper<cpp20_input_iterator<int*>> end() const;
42 };
43 
44 template <class... Views>
45 using zip_iter = std::ranges::iterator_t<std::ranges::zip_view<Views...>>;
46 
47 static_assert(!std::default_initializable<zip_iter<IterNoDefaultCtrView>>);
48 static_assert(!std::default_initializable<zip_iter<IterNoDefaultCtrView, IterDefaultCtrView>>);
49 static_assert(!std::default_initializable<zip_iter<IterNoDefaultCtrView, IterNoDefaultCtrView>>);
50 static_assert(std::default_initializable<zip_iter<IterDefaultCtrView>>);
51 static_assert(std::default_initializable<zip_iter<IterDefaultCtrView, IterDefaultCtrView>>);
52 
test()53 constexpr bool test() {
54   using ZipIter = zip_iter<IterDefaultCtrView>;
55   {
56     ZipIter iter;
57     auto [x] = *iter;
58     assert(x == 0); // PODIter has to be initialised to have value 0
59   }
60 
61   {
62     ZipIter iter = {};
63     auto [x] = *iter;
64     assert(x == 0); // PODIter has to be initialised to have value 0
65   }
66   return true;
67 }
68 
main(int,char **)69 int main(int, char**) {
70   test();
71   static_assert(test());
72 
73   return 0;
74 }
75