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 
12 // decltype(auto) operator->() const
13 //   requires see below;
14 
15 #include <iterator>
16 #include <cassert>
17 
18 #include "test_macros.h"
19 #include "types.h"
20 
21 void test() {
22   int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8};
23 
24   // Case 2: http://eel.is/c++draft/iterators.common#common.iter.access-5.2
25   {
26     auto iter1 = simple_iterator<int*>(buffer);
27     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
28     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
29 
30     assert(commonIter1.operator->() == buffer);
31     assert(commonIter2.operator->() == buffer);
32   }
33 
34   // Case 3: http://eel.is/c++draft/iterators.common#common.iter.access-5.3
35   {
36     auto iter1 = value_iterator<int*>(buffer);
37     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
38     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
39 
40     assert(*commonIter1.operator->().operator->() == 1);
41     assert(*commonIter2.operator->().operator->() == 1);
42   }
43 
44   // Case 3: http://eel.is/c++draft/iterators.common#common.iter.access-5.3
45   {
46     auto iter1 = void_plus_plus_iterator<int*>(buffer);
47     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
48     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
49 
50     assert(*commonIter1.operator->().operator->() == 1);
51     assert(*commonIter2.operator->().operator->() == 1);
52   }
53 
54   // Case 1: http://eel.is/c++draft/iterators.common#common.iter.access-5.1
55   {
56     auto iter1 = cpp17_input_iterator<int*>(buffer);
57     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
58     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
59 
60     assert(commonIter1.operator->().base() == buffer);
61     assert(commonIter2.operator->().base() == buffer);
62   }
63 
64   // Case 1: http://eel.is/c++draft/iterators.common#common.iter.access-5.1
65   {
66     auto iter1 = forward_iterator<int*>(buffer);
67     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
68     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
69 
70     assert(commonIter1.operator->().base() == buffer);
71     assert(commonIter2.operator->().base() == buffer);
72   }
73 
74   // Case 1: http://eel.is/c++draft/iterators.common#common.iter.access-5.1
75   {
76     auto iter1 = random_access_iterator<int*>(buffer);
77     auto commonIter1 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
78     const auto commonIter2 = std::common_iterator<decltype(iter1), sentinel_type<int*>>(iter1);
79 
80     assert(commonIter1.operator->().base() == buffer);
81     assert(commonIter2.operator->().base() == buffer);
82   }
83 }
84 
85 int main(int, char**) {
86   test();
87 
88   return 0;
89 }
90