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: libcpp-has-no-incomplete-ranges 12 13 // constexpr iterator& operator++(); 14 // constexpr void operator++(int); 15 // constexpr iterator operator++(int) requires incrementable<W>; 16 17 #include <ranges> 18 #include <cassert> 19 20 #include "test_macros.h" 21 #include "../types.h" 22 23 constexpr bool test() { 24 { 25 std::ranges::iota_view<int> io(0); 26 auto iter1 = io.begin(); 27 auto iter2 = io.begin(); 28 assert(iter1 == iter2); 29 assert(++iter1 != iter2++); 30 assert(iter1 == iter2); 31 32 static_assert(!std::is_reference_v<decltype(iter2++)>); 33 static_assert( std::is_reference_v<decltype(++iter2)>); 34 static_assert(std::same_as<std::remove_reference_t<decltype(++iter2)>, decltype(iter2++)>); 35 } 36 { 37 std::ranges::iota_view io(SomeInt(0)); 38 auto iter1 = io.begin(); 39 auto iter2 = io.begin(); 40 assert(iter1 == iter2); 41 assert(++iter1 != iter2++); 42 assert(iter1 == iter2); 43 44 static_assert(!std::is_reference_v<decltype(iter2++)>); 45 static_assert( std::is_reference_v<decltype(++iter2)>); 46 static_assert(std::same_as<std::remove_reference_t<decltype(++iter2)>, decltype(iter2++)>); 47 } 48 49 { 50 std::ranges::iota_view<NotIncrementable> io(NotIncrementable(0)); 51 auto iter1 = io.begin(); 52 auto iter2 = io.begin(); 53 assert(iter1 == iter2); 54 assert(++iter1 != iter2); 55 iter2++; 56 assert(iter1 == iter2); 57 58 static_assert(std::same_as<decltype(iter2++), void>); 59 static_assert(std::is_reference_v<decltype(++iter2)>); 60 } 61 62 return true; 63 } 64 65 int main(int, char**) { 66 test(); 67 static_assert(test()); 68 69 return 0; 70 } 71