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