1*7b20e05cSzoecarver //===----------------------------------------------------------------------===// 2*7b20e05cSzoecarver // 3*7b20e05cSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*7b20e05cSzoecarver // See https://llvm.org/LICENSE.txt for license information. 5*7b20e05cSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*7b20e05cSzoecarver // 7*7b20e05cSzoecarver //===----------------------------------------------------------------------===// 8*7b20e05cSzoecarver 9*7b20e05cSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17 10*7b20e05cSzoecarver // UNSUPPORTED: libcpp-has-no-incomplete-ranges 11*7b20e05cSzoecarver 12*7b20e05cSzoecarver // constexpr iterator& operator++(); 13*7b20e05cSzoecarver // constexpr void operator++(int); 14*7b20e05cSzoecarver // constexpr iterator operator++(int) requires incrementable<W>; 15*7b20e05cSzoecarver 16*7b20e05cSzoecarver #include <ranges> 17*7b20e05cSzoecarver #include <cassert> 18*7b20e05cSzoecarver 19*7b20e05cSzoecarver #include "test_macros.h" 20*7b20e05cSzoecarver #include "../types.h" 21*7b20e05cSzoecarver test()22*7b20e05cSzoecarverconstexpr bool test() { 23*7b20e05cSzoecarver { 24*7b20e05cSzoecarver std::ranges::iota_view<int> io(0); 25*7b20e05cSzoecarver auto iter1 = io.begin(); 26*7b20e05cSzoecarver auto iter2 = io.begin(); 27*7b20e05cSzoecarver assert(iter1 == iter2); 28*7b20e05cSzoecarver assert(++iter1 != iter2++); 29*7b20e05cSzoecarver assert(iter1 == iter2); 30*7b20e05cSzoecarver 31*7b20e05cSzoecarver static_assert(!std::is_reference_v<decltype(iter2++)>); 32*7b20e05cSzoecarver static_assert( std::is_reference_v<decltype(++iter2)>); 33*7b20e05cSzoecarver static_assert(std::same_as<std::remove_reference_t<decltype(++iter2)>, decltype(iter2++)>); 34*7b20e05cSzoecarver } 35*7b20e05cSzoecarver { 36*7b20e05cSzoecarver std::ranges::iota_view io(SomeInt(0)); 37*7b20e05cSzoecarver auto iter1 = io.begin(); 38*7b20e05cSzoecarver auto iter2 = io.begin(); 39*7b20e05cSzoecarver assert(iter1 == iter2); 40*7b20e05cSzoecarver assert(++iter1 != iter2++); 41*7b20e05cSzoecarver assert(iter1 == iter2); 42*7b20e05cSzoecarver 43*7b20e05cSzoecarver static_assert(!std::is_reference_v<decltype(iter2++)>); 44*7b20e05cSzoecarver static_assert( std::is_reference_v<decltype(++iter2)>); 45*7b20e05cSzoecarver static_assert(std::same_as<std::remove_reference_t<decltype(++iter2)>, decltype(iter2++)>); 46*7b20e05cSzoecarver } 47*7b20e05cSzoecarver 48*7b20e05cSzoecarver { 49*7b20e05cSzoecarver std::ranges::iota_view<NotIncrementable> io(NotIncrementable(0)); 50*7b20e05cSzoecarver auto iter1 = io.begin(); 51*7b20e05cSzoecarver auto iter2 = io.begin(); 52*7b20e05cSzoecarver assert(iter1 == iter2); 53*7b20e05cSzoecarver assert(++iter1 != iter2); 54*7b20e05cSzoecarver iter2++; 55*7b20e05cSzoecarver assert(iter1 == iter2); 56*7b20e05cSzoecarver 57*7b20e05cSzoecarver static_assert(std::same_as<decltype(iter2++), void>); 58*7b20e05cSzoecarver static_assert(std::is_reference_v<decltype(++iter2)>); 59*7b20e05cSzoecarver } 60*7b20e05cSzoecarver 61*7b20e05cSzoecarver return true; 62*7b20e05cSzoecarver } 63*7b20e05cSzoecarver main(int,char **)64*7b20e05cSzoecarverint main(int, char**) { 65*7b20e05cSzoecarver test(); 66*7b20e05cSzoecarver static_assert(test()); 67*7b20e05cSzoecarver 68*7b20e05cSzoecarver return 0; 69*7b20e05cSzoecarver } 70