diff --git a/libcxx/include/iterator b/libcxx/include/iterator index d25fdfd2a8b33..fc8bdc5e6bcf6 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -737,6 +737,16 @@ template constexpr const E* data(initializer_list il) noexcept; # include # include +// [range.access.general] +# if _LIBCPP_STD_VER >= 20 +# include <__ranges/access.h> +# include <__ranges/data.h> +# include <__ranges/empty.h> +# include <__ranges/rbegin.h> +# include <__ranges/rend.h> +# include <__ranges/size.h> +# endif + # if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header # endif diff --git a/libcxx/test/std/library/description/conventions/customization.point.object/cpo.compile.pass.cpp b/libcxx/test/std/library/description/conventions/customization.point.object/cpo.compile.pass.cpp index 678483b9b2f2f..49497875dcf95 100644 --- a/libcxx/test/std/library/description/conventions/customization.point.object/cpo.compile.pass.cpp +++ b/libcxx/test/std/library/description/conventions/customization.point.object/cpo.compile.pass.cpp @@ -81,6 +81,10 @@ static_assert(test(std::ranges::rend, a)); static_assert(test(std::ranges::size, a)); static_assert(test(std::ranges::ssize, a)); +#if TEST_STD_VER >= 26 +// static_assert(test(std::views::reserve_hint, a)); +#endif + // [range.factories] // views::empty is not a CPO static_assert(test(std::views::iota, 1)); diff --git a/libcxx/test/std/ranges/range.access/include.iterator.pass.cpp b/libcxx/test/std/ranges/range.access/include.iterator.pass.cpp new file mode 100644 index 0000000000000..bb2cda0e4d906 --- /dev/null +++ b/libcxx/test/std/ranges/range.access/include.iterator.pass.cpp @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// 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()); +}