1e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
2e53c461bSKonstantin Varlamov //
3e53c461bSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e53c461bSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5e53c461bSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e53c461bSKonstantin Varlamov //
7e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
8e53c461bSKonstantin Varlamov 
9e53c461bSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14, c++17
10e53c461bSKonstantin Varlamov 
11e53c461bSKonstantin Varlamov // constexpr outer-iterator& outer-iterator::operator++();
12e53c461bSKonstantin Varlamov // constexpr decltype(auto) outer-iterator::operator++(int);
13e53c461bSKonstantin Varlamov 
14e53c461bSKonstantin Varlamov // Note that corner cases are tested in `range.lazy.split/general.pass.cpp`.
15e53c461bSKonstantin Varlamov 
16e53c461bSKonstantin Varlamov #include <ranges>
17e53c461bSKonstantin Varlamov 
18e53c461bSKonstantin Varlamov #include <algorithm>
19*ae2ae84fSJoe Loser #include <cassert>
20*ae2ae84fSJoe Loser #include <string>
21e53c461bSKonstantin Varlamov #include "../types.h"
22e53c461bSKonstantin Varlamov 
test()23e53c461bSKonstantin Varlamov constexpr bool test() {
24*ae2ae84fSJoe Loser   using namespace std::string_literals;
25e53c461bSKonstantin Varlamov   // Can call `outer-iterator::operator++`; `View` is a forward range.
26e53c461bSKonstantin Varlamov   {
27e53c461bSKonstantin Varlamov     SplitViewForward v("abc def ghi", " ");
28e53c461bSKonstantin Varlamov 
29e53c461bSKonstantin Varlamov     // ++i
30e53c461bSKonstantin Varlamov     {
31e53c461bSKonstantin Varlamov       auto i = v.begin();
32*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i, "abc"s));
33e53c461bSKonstantin Varlamov 
34e53c461bSKonstantin Varlamov       decltype(auto) i2 = ++i;
35e53c461bSKonstantin Varlamov       static_assert(std::is_lvalue_reference_v<decltype(i2)>);
36e53c461bSKonstantin Varlamov       assert(&i2 == &i);
37*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i2, "def"s));
38e53c461bSKonstantin Varlamov     }
39e53c461bSKonstantin Varlamov 
40e53c461bSKonstantin Varlamov     // i++
41e53c461bSKonstantin Varlamov     {
42e53c461bSKonstantin Varlamov       auto i = v.begin();
43*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i, "abc"s));
44e53c461bSKonstantin Varlamov 
45e53c461bSKonstantin Varlamov       decltype(auto) i2 = i++;
46e53c461bSKonstantin Varlamov       static_assert(!std::is_reference_v<decltype(i2)>);
47*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i2, "abc"s));
48*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i, "def"s));
49e53c461bSKonstantin Varlamov     }
50e53c461bSKonstantin Varlamov   }
51e53c461bSKonstantin Varlamov 
52e53c461bSKonstantin Varlamov   // Can call `outer-iterator::operator++`; `View` is an input range.
53e53c461bSKonstantin Varlamov   {
54e53c461bSKonstantin Varlamov     SplitViewInput v("abc def ghi", ' ');
55e53c461bSKonstantin Varlamov 
56e53c461bSKonstantin Varlamov     // ++i
57e53c461bSKonstantin Varlamov     {
58e53c461bSKonstantin Varlamov       auto i = v.begin();
59*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i, "abc"s));
60e53c461bSKonstantin Varlamov 
61e53c461bSKonstantin Varlamov       decltype(auto) i2 = ++i;
62e53c461bSKonstantin Varlamov       static_assert(std::is_lvalue_reference_v<decltype(i2)>);
63e53c461bSKonstantin Varlamov       assert(&i2 == &i);
64*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i2, "def"s));
65e53c461bSKonstantin Varlamov     }
66e53c461bSKonstantin Varlamov 
67e53c461bSKonstantin Varlamov     // i++
68e53c461bSKonstantin Varlamov     {
69e53c461bSKonstantin Varlamov       auto i = v.begin();
70*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i, "abc"s));
71e53c461bSKonstantin Varlamov 
72e53c461bSKonstantin Varlamov       static_assert(std::is_void_v<decltype(i++)>);
73e53c461bSKonstantin Varlamov       i++;
74*ae2ae84fSJoe Loser       assert(std::ranges::equal(*i, "def"s));
75e53c461bSKonstantin Varlamov     }
76e53c461bSKonstantin Varlamov   }
77e53c461bSKonstantin Varlamov 
78e53c461bSKonstantin Varlamov   return true;
79e53c461bSKonstantin Varlamov }
80e53c461bSKonstantin Varlamov 
main(int,char **)81e53c461bSKonstantin Varlamov int main(int, char**) {
82e53c461bSKonstantin Varlamov   test();
83e53c461bSKonstantin Varlamov   static_assert(test());
84e53c461bSKonstantin Varlamov 
85e53c461bSKonstantin Varlamov   return 0;
86e53c461bSKonstantin Varlamov }
87