//===----------------------------------------------------------------------===// // // 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 sentinel end(); // constexpr iterator end() requires common_range; // constexpr sentinel end() const // requires range && // regular_invocable>; // constexpr iterator end() const // requires common_range && // regular_invocable>; #include #include "test_macros.h" #include "types.h" template concept HasConstQualifiedEnd = requires(const T& t) { t.end(); }; constexpr bool test() { { using TransformView = std::ranges::transform_view; static_assert(std::ranges::common_range); TransformView tv; auto it = tv.end(); using It = decltype(it); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), const forward_iterator&); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), forward_iterator); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), const forward_iterator&); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), const forward_iterator&); assert(base(it.base()) == globalBuff + 8); assert(base(std::move(it).base()) == globalBuff + 8); static_assert(!HasConstQualifiedEnd); } { using TransformView = std::ranges::transform_view; static_assert(!std::ranges::common_range); TransformView tv; auto sent = tv.end(); using Sent = decltype(sent); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); assert(base(base(sent.base())) == globalBuff + 8); assert(base(base(std::move(sent).base())) == globalBuff + 8); static_assert(!HasConstQualifiedEnd); } { using TransformView = std::ranges::transform_view; static_assert(!std::ranges::common_range); TransformView tv; auto sent = tv.end(); using Sent = decltype(sent); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(sent).base()), sentinel_wrapper>); assert(base(base(sent.base())) == globalBuff + 8); assert(base(base(std::move(sent).base())) == globalBuff + 8); auto csent = std::as_const(tv).end(); using CSent = decltype(csent); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), sentinel_wrapper>); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), sentinel_wrapper>); assert(base(base(csent.base())) == globalBuff + 8); assert(base(base(std::move(csent).base())) == globalBuff + 8); } { using TransformView = std::ranges::transform_view; static_assert(std::ranges::common_range); TransformView tv; auto it = tv.end(); using It = decltype(it); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int* const&); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int*); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int* const&); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int* const&); assert(base(it.base()) == globalBuff + 8); assert(base(std::move(it).base()) == globalBuff + 8); static_assert(!HasConstQualifiedEnd); } { using TransformView = std::ranges::transform_view; static_assert(std::ranges::common_range); TransformView tv; auto it = tv.end(); using It = decltype(it); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int* const&); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int*); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int* const&); ASSERT_SAME_TYPE(decltype(static_cast(it).base()), int* const&); assert(base(it.base()) == globalBuff + 8); assert(base(std::move(it).base()) == globalBuff + 8); auto csent = std::as_const(tv).end(); using CSent = decltype(csent); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), int* const&); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), int*); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), int* const&); ASSERT_SAME_TYPE(decltype(static_cast(csent).base()), int* const&); assert(base(base(csent.base())) == globalBuff + 8); assert(base(base(std::move(csent).base())) == globalBuff + 8); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }