//===----------------------------------------------------------------------===// // // 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 // std::ranges::ssize #include #include #include "test_macros.h" #include "test_iterators.h" using RangeSSizeT = decltype(std::ranges::ssize); static_assert(!std::is_invocable_v); static_assert( std::is_invocable_v); static_assert( std::is_invocable_v); static_assert( std::is_invocable_v); struct SizeMember { constexpr std::size_t size() { return 42; } }; static_assert(!std::is_invocable_v); struct SizeFunction { friend constexpr std::size_t size(SizeFunction) { return 42; } }; struct SizeFunctionSigned { friend constexpr std::ptrdiff_t size(SizeFunctionSigned) { return 42; } }; struct SizedSentinelRange { int data_[2] = {}; constexpr int *begin() { return data_; } constexpr auto end() { return sized_sentinel(data_ + 2); } }; struct ShortUnsignedReturnType { constexpr unsigned short size() { return 42; } }; // size_t changes depending on the platform. using SignedSizeT = std::make_signed_t; constexpr bool test() { int a[4]; assert(std::ranges::ssize(a) == 4); ASSERT_SAME_TYPE(decltype(std::ranges::ssize(a)), SignedSizeT); assert(std::ranges::ssize(SizeMember()) == 42); ASSERT_SAME_TYPE(decltype(std::ranges::ssize(SizeMember())), SignedSizeT); assert(std::ranges::ssize(SizeFunction()) == 42); ASSERT_SAME_TYPE(decltype(std::ranges::ssize(SizeFunction())), SignedSizeT); assert(std::ranges::ssize(SizeFunctionSigned()) == 42); ASSERT_SAME_TYPE(decltype(std::ranges::ssize(SizeFunctionSigned())), std::ptrdiff_t); SizedSentinelRange b; assert(std::ranges::ssize(b) == 2); ASSERT_SAME_TYPE(decltype(std::ranges::ssize(b)), std::ptrdiff_t); // This gets converted to ptrdiff_t because it's wider. ShortUnsignedReturnType c; assert(std::ranges::ssize(c) == 42); ASSERT_SAME_TYPE(decltype(std::ranges::ssize(c)), std::ptrdiff_t); return true; } // Test ADL-proofing. struct Incomplete; template struct Holder { T t; }; static_assert(!std::is_invocable_v*>); static_assert(!std::is_invocable_v*&>); int main(int, char**) { test(); static_assert(test()); return 0; }