//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // constexpr iterator& operator++(); // constexpr void operator++(int); // constexpr iterator operator++(int) requires forward_range; #include #include #include #include #include #include "test_iterators.h" template > constexpr void testOne() { using Range = std::ranges::subrange; std::tuple ts[] = {{1}, {2}, {3}}; // ++i { auto ev = Range{Iter{std::begin(ts)}, Sent{Iter{std::end(ts)}}} | std::views::elements<0>; auto it = ev.begin(); decltype(auto) result = ++it; using ElementIter = std::ranges::iterator_t; static_assert(std::is_same_v); assert(&result == &it); assert(base(it.base()) == &ts[1]); } // i++ { auto ev = Range{Iter{std::begin(ts)}, Sent{Iter{std::end(ts)}}} | std::views::elements<0>; if constexpr (std::forward_iterator) { auto it = ev.begin(); decltype(auto) result = it++; using ElementIter = std::ranges::iterator_t; static_assert(std::is_same_v); assert(base(it.base()) == &ts[1]); assert(base(result.base()) == &ts[0]); } else { auto it = ev.begin(); it++; static_assert(std::is_same_v); assert(base(it.base()) == &ts[1]); } } } constexpr bool test() { using Ptr = std::tuple*; testOne>(); testOne>(); testOne>(); testOne>(); testOne>(); testOne(); return true; } int main(int, char**) { test(); static_assert(test()); return 0; }