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