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-has-no-incomplete-ranges 11 12 // constexpr outer-iterator& outer-iterator::operator++(); 13 // constexpr decltype(auto) outer-iterator::operator++(int); 14 15 // Note that corner cases are tested in `range.lazy.split/general.pass.cpp`. 16 17 #include <ranges> 18 19 #include <algorithm> 20 #include <cassert> 21 #include <string> 22 #include "../types.h" 23 24 constexpr bool test() { 25 using namespace std::string_literals; 26 // Can call `outer-iterator::operator++`; `View` is a forward range. 27 { 28 SplitViewForward v("abc def ghi", " "); 29 30 // ++i 31 { 32 auto i = v.begin(); 33 assert(std::ranges::equal(*i, "abc"s)); 34 35 decltype(auto) i2 = ++i; 36 static_assert(std::is_lvalue_reference_v<decltype(i2)>); 37 assert(&i2 == &i); 38 assert(std::ranges::equal(*i2, "def"s)); 39 } 40 41 // i++ 42 { 43 auto i = v.begin(); 44 assert(std::ranges::equal(*i, "abc"s)); 45 46 decltype(auto) i2 = i++; 47 static_assert(!std::is_reference_v<decltype(i2)>); 48 assert(std::ranges::equal(*i2, "abc"s)); 49 assert(std::ranges::equal(*i, "def"s)); 50 } 51 } 52 53 // Can call `outer-iterator::operator++`; `View` is an input range. 54 { 55 SplitViewInput v("abc def ghi", ' '); 56 57 // ++i 58 { 59 auto i = v.begin(); 60 assert(std::ranges::equal(*i, "abc"s)); 61 62 decltype(auto) i2 = ++i; 63 static_assert(std::is_lvalue_reference_v<decltype(i2)>); 64 assert(&i2 == &i); 65 assert(std::ranges::equal(*i2, "def"s)); 66 } 67 68 // i++ 69 { 70 auto i = v.begin(); 71 assert(std::ranges::equal(*i, "abc"s)); 72 73 static_assert(std::is_void_v<decltype(i++)>); 74 i++; 75 assert(std::ranges::equal(*i, "def"s)); 76 } 77 } 78 79 return true; 80 } 81 82 int main(int, char**) { 83 test(); 84 static_assert(test()); 85 86 return 0; 87 } 88