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
10 // UNSUPPORTED: libcpp-no-concepts
11 // UNSUPPORTED: gcc-10
12 
13 // decltype(auto) operator*();
14 // decltype(auto) operator*() const
15 //   requires dereferenceable<const I>;
16 
17 #include <iterator>
18 #include <cassert>
19 
20 #include "test_macros.h"
21 #include "types.h"
22 
23 void test() {
24   int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
25 
26   {
27     auto iter1 = simple_iterator<int*>(buffer);
28     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
29     auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8});
30 
31     const auto iter2 = simple_iterator<int*>(buffer);
32     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
33 
34     assert(*iter1 == 1);
35     assert(*commonIter1 == 1);
36 
37     assert(*iter2 == 1);
38     assert(*commonIter2 == 1);
39 
40     assert(*(commonIter1++) == 1);
41     assert(*commonIter1 == 2);
42     assert(*(++commonIter1) == 3);
43     assert(*commonIter1 == 3);
44 
45     for (auto i = 3; commonIter1 != commonSent1; ++i) {
46       assert(*(commonIter1++) == i);
47     }
48   }
49   {
50     auto iter1 = value_iterator<int*>(buffer);
51     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
52     auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8});
53 
54     const auto iter2 = value_iterator<int*>(buffer);
55     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
56 
57     assert(*iter1 == 1);
58     assert(*commonIter1 == 1);
59 
60     assert(*iter2 == 1);
61     assert(*commonIter2 == 1);
62 
63     assert(*(commonIter1++) == 1);
64     assert(*commonIter1 == 2);
65     assert(*(++commonIter1) == 3);
66     assert(*commonIter1 == 3);
67 
68     for (auto i = 3; commonIter1 != commonSent1; ++i) {
69       assert(*(commonIter1++) == i);
70     }
71   }
72   {
73     auto iter1 = cpp17_input_iterator<int*>(buffer);
74     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
75     auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8});
76 
77     const auto iter2 = cpp17_input_iterator<int*>(buffer);
78     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
79 
80     assert(*iter1 == 1);
81     assert(*commonIter1 == 1);
82 
83     assert(*iter2 == 1);
84     assert(*commonIter2 == 1);
85 
86     assert(*(commonIter1++) == 1);
87     assert(*commonIter1 == 2);
88     assert(*(++commonIter1) == 3);
89     assert(*commonIter1 == 3);
90 
91     for (auto i = 3; commonIter1 != commonSent1; ++i) {
92       assert(*(commonIter1++) == i);
93     }
94   }
95   {
96     auto iter1 = forward_iterator<int*>(buffer);
97     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
98     auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8});
99 
100     const auto iter2 = forward_iterator<int*>(buffer);
101     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
102 
103     assert(*iter1 == 1);
104     assert(*commonIter1 == 1);
105 
106     assert(*iter2 == 1);
107     assert(*commonIter2 == 1);
108 
109     assert(*(commonIter1++) == 1);
110     assert(*commonIter1 == 2);
111     assert(*(++commonIter1) == 3);
112     assert(*commonIter1 == 3);
113 
114     for (auto i = 3; commonIter1 != commonSent1; ++i) {
115       assert(*(commonIter1++) == i);
116     }
117   }
118   {
119     auto iter1 = random_access_iterator<int*>(buffer);
120     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
121     auto commonSent1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(sentinel_type<int*>{buffer + 8});
122 
123     const auto iter2 = random_access_iterator<int*>(buffer);
124     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
125 
126     assert(*iter1 == 1);
127     assert(*commonIter1 == 1);
128 
129     assert(*iter2 == 1);
130     assert(*commonIter2 == 1);
131 
132     assert(*(commonIter1++) == 1);
133     assert(*commonIter1 == 2);
134     assert(*(++commonIter1) == 3);
135     assert(*commonIter1 == 3);
136 
137     for (auto i = 3; commonIter1 != commonSent1; ++i) {
138       assert(*(commonIter1++) == i);
139     }
140   }
141 }
142 
143 int main(int, char**) {
144   test();
145 
146   return 0;
147 }
148