//===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // REQUIRES: std-at-least-c++20 // [range.access.general]/1: // In addition to being available via inclusion of the header, the customization point objects in // [range.access] are available when the header is included. #include #include #include "test_macros.h" template constexpr void test(CPO& o, Args&&... args) { static_assert(std::is_const_v); static_assert(std::is_class_v); static_assert(std::is_trivially_copyable_v); static_assert(std::is_trivially_default_constructible_v); auto p = o; using T = decltype(p); (void)o(args...); // to make sure the CPO can actually be used // The type of a customization point object, ignoring cv-qualifiers, shall model semiregular. static_assert(std::semiregular); // The type T of a customization point object, ignoring cv-qualifiers, shall model... static_assert(std::invocable); static_assert(std::invocable); static_assert(std::invocable); static_assert(std::invocable); } int a[10]; constexpr bool test() { test(std::ranges::begin, a); test(std::ranges::end, a); test(std::ranges::cbegin, a); test(std::ranges::cdata, a); test(std::ranges::cend, a); test(std::ranges::crbegin, a); test(std::ranges::crend, a); test(std::ranges::data, a); test(std::ranges::empty, a); test(std::ranges::rbegin, a); test(std::ranges::rend, a); test(std::ranges::size, a); test(std::ranges::ssize, a); #if TEST_STD_VER >= 26 // test(std::views::reserve_hint, a); #endif return true; } int main() { test(); static_assert(test()); }