//===----------------------------------------------------------------------===// // // 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 // projected #include #include #include #include "test_iterators.h" using IntPtr = std::projected; static_assert(std::same_as); static_assert(std::same_as()), int const&>); static_assert(std::same_as, std::ptrdiff_t>); struct S { }; using Cpp17InputIterator = std::projected, int S::*>; static_assert(std::same_as); static_assert(std::same_as()), int&>); static_assert(std::same_as, std::ptrdiff_t>); using Cpp20InputIterator = std::projected, int S::*>; static_assert(std::same_as); static_assert(std::same_as()), int&>); static_assert(std::same_as, std::ptrdiff_t>); using ForwardIterator = std::projected, int (S::*)()>; static_assert(std::same_as); static_assert(std::same_as()), int>); static_assert(std::same_as, std::ptrdiff_t>); using BidirectionalIterator = std::projected, S* (S::*)() const>; static_assert(std::same_as); static_assert(std::same_as()), S*>); static_assert(std::same_as, std::ptrdiff_t>); using RandomAccessIterator = std::projected, S && (S::*)()>; static_assert(std::same_as); static_assert(std::same_as()), S&&>); static_assert(std::same_as, std::ptrdiff_t>); using ContiguousIterator = std::projected, S& (S::*)() const>; static_assert(std::same_as); static_assert(std::same_as()), S&>); static_assert(std::same_as, std::ptrdiff_t>); template constexpr bool projectable = requires { typename std::projected; }; static_assert(!projectable); // int isn't indirectly_readable static_assert(!projectable); // S isn't weakly_incrementable static_assert(!projectable); // void(int) doesn't satisfy indirectly_regular_unary_invcable