[libcxx-commits] [libcxx] WIP [libc++][ranges] P3138R3: `views::cache_latest` (PR #151450)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jul 31 07:42:15 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Hristo Hristov (H-G-Hristov)

<details>
<summary>Changes</summary>

Implements: https://wg21.link/P3138R3

Closes #<!-- -->118134

# References

- https://wg21.link/range.cache.latest
- https://wg21.link/range.nonprop.cache

---

Patch is 50.67 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/151450.diff


25 Files Affected:

- (modified) libcxx/docs/FeatureTestMacroTable.rst (+2) 
- (modified) libcxx/docs/ReleaseNotes/22.rst (+1) 
- (modified) libcxx/docs/Status/Cxx2cPapers.csv (+1-1) 
- (modified) libcxx/include/CMakeLists.txt (+1) 
- (added) libcxx/include/__ranges/cache_latest_view.h (+223) 
- (modified) libcxx/include/__ranges/non_propagating_cache.h (+2) 
- (modified) libcxx/include/module.modulemap.in (+1) 
- (modified) libcxx/include/ranges (+11) 
- (modified) libcxx/include/version (+2) 
- (modified) libcxx/modules/std/ranges.inc (+9) 
- (added) libcxx/test/libcxx/ranges/range.nonprop.cache/reset.pass.cpp (+52) 
- (modified) libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp (+30) 
- (modified) libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp (+30) 
- (modified) libcxx/test/std/library/description/conventions/customization.point.object/cpo.compile.pass.cpp (+1-1) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/adaptor.pass.cpp (+259) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/base.pass.cpp (+85) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/begin.pass.cpp (+24) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/ctad.compile.pass.cpp (+30) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/ctor.default.pass.cpp (+81) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/ctor.view.pass.cpp (+24) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/enable_borrowed_range.compile.pass.cpp (+34) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/end.pass.cpp (+24) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/general.pass.cpp (+75) 
- (added) libcxx/test/std/ranges/range.adaptors/range.cache.latest/size.pass.cpp (+109) 
- (modified) libcxx/utils/generate_feature_test_macro_components.py (+5) 


``````````diff
diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst
index 61805726a4ff0..a0e999713046b 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -370,6 +370,8 @@ Status
     ---------------------------------------------------------- -----------------
     ``__cpp_lib_ranges_as_rvalue``                             ``202207L``
     ---------------------------------------------------------- -----------------
+    ``__cpp_lib_ranges_cache_latest``                          ``202411L``
+    ---------------------------------------------------------- -----------------
     ``__cpp_lib_ranges_chunk``                                 *unimplemented*
     ---------------------------------------------------------- -----------------
     ``__cpp_lib_ranges_chunk_by``                              ``202202L``
diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 15bf46d44b07f..f90ae66d49be9 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -39,6 +39,7 @@ Implemented Papers
 ------------------
 
 - P2321R2: ``zip`` (`Github <https://github.com/llvm/llvm-project/issues/105169>`__) (The paper is partially implemented. ``zip_transform_view`` is implemented in this release)
+- P3138R3: ``std::ranges::cache_latest`` (`Github <https://github.com/llvm/llvm-project/issues/118134>`__)
 
 Improvements and New Features
 -----------------------------
diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv
index febb0c176f9c4..76f3696476762 100644
--- a/libcxx/docs/Status/Cxx2cPapers.csv
+++ b/libcxx/docs/Status/Cxx2cPapers.csv
@@ -77,7 +77,7 @@
 "`P2300R10 <https://wg21.link/P2300R10>`__","``std::execution``","2024-06 (St. Louis)","","",""
 "","","","","",""
 "`P3136R1 <https://wg21.link/P3136R1>`__","Retiring niebloids","2024-11 (Wrocław)","|Complete|","14",""
-"`P3138R5 <https://wg21.link/P3138R5>`__","``views::cache_latest``","2024-11 (Wrocław)","","",""
+"`P3138R5 <https://wg21.link/P3138R5>`__","``views::cache_latest``","2024-11 (Wrocław)","|Complete|","22",""
 "`P3379R0 <https://wg21.link/P3379R0>`__","Constrain ``std::expected`` equality operators","2024-11 (Wrocław)","|Complete|","21",""
 "`P2862R1 <https://wg21.link/P2862R1>`__","``text_encoding::name()`` should never return null values","2024-11 (Wrocław)","","",""
 "`P2897R7 <https://wg21.link/P2897R7>`__","``aligned_accessor``: An ``mdspan`` accessor expressing pointer over-alignment","2024-11 (Wrocław)","|Complete|","21",""
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index ed5475141b50a..1ebdd75319878 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -698,6 +698,7 @@ set(files
   __ranges/access.h
   __ranges/all.h
   __ranges/as_rvalue_view.h
+  __ranges/cache_latest_view.h
   __ranges/chunk_by_view.h
   __ranges/common_view.h
   __ranges/concepts.h
diff --git a/libcxx/include/__ranges/cache_latest_view.h b/libcxx/include/__ranges/cache_latest_view.h
new file mode 100644
index 0000000000000..9e1db7b67a90d
--- /dev/null
+++ b/libcxx/include/__ranges/cache_latest_view.h
@@ -0,0 +1,223 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___RANGES_TO_CACHE_LATEST_VIEW_H
+#define _LIBCPP___RANGES_TO_CACHE_LATEST_VIEW_H
+
+#include <__concepts/constructible.h>
+#include <__config>
+#include <__iterator/concepts.h>
+#include <__iterator/iter_move.h>
+#include <__iterator/iter_swap.h>
+#include <__memory/addressof.h>
+#include <__ranges/access.h>
+#include <__ranges/all.h>
+#include <__ranges/concepts.h>
+#include <__ranges/non_propagating_cache.h>
+#include <__ranges/range_adaptor.h>
+#include <__ranges/view_interface.h>
+#include <__type_traits/conditional.h>
+#include <__type_traits/is_reference.h>
+#include <__utility/as_lvalue.h>
+#include <__utility/forward.h>
+#include <__utility/move.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_PUSH_MACROS
+#include <__undef_macros>
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#if _LIBCPP_STD_VER >= 26
+
+namespace ranges {
+
+// [range.cache.latest.view]
+
+template <input_range _View>
+  requires view<_View>
+class cache_latest_view : public view_interface<cache_latest_view<_View>> {
+  _View __base_ = _View(); // exposition only
+  using __cache_t =
+      conditional_t<is_reference_v<range_reference_t<_View>>, // exposition only
+                    add_pointer_t<range_reference_t<_View>>,
+                    range_reference_t<_View>>;
+
+  __non_propagating_cache<__cache_t> __cache_; // exposition only
+
+  // [range.cache.latest.iterator], class cache_latest_view::iterator
+  class iterator; // exposition only
+  // [range.cache.latest.sentinel], class cache_latest_view::sentinel
+  class sentinel; // exposition only
+
+public:
+  _LIBCPP_HIDE_FROM_ABI cache_latest_view()
+    requires default_initializable<_View>
+  = default;
+  _LIBCPP_HIDE_FROM_ABI constexpr explicit cache_latest_view(_View __base) : __base_{std::move(__base)} {}
+
+  _LIBCPP_HIDE_FROM_ABI constexpr _View base() const&
+    requires copy_constructible<_View>
+  {
+    return __base_;
+  }
+  _LIBCPP_HIDE_FROM_ABI constexpr _View base() && { return std::move(__base_); }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr auto begin() { return iterator(*this); }
+  _LIBCPP_HIDE_FROM_ABI constexpr auto end() { return sentinel{*this}; }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr auto size()
+    requires sized_range<_View>
+  {
+    return ranges::size(__base_);
+  }
+  _LIBCPP_HIDE_FROM_ABI constexpr auto size() const
+    requires sized_range<const _View>
+  {
+    return ranges::size(__base_);
+  }
+
+  // TODO: Implement when P2846R6 is available.
+  // constexpr auto reserve_hint()
+  //   requires approximately_sized_range<_View>
+  // {
+  //   return ranges::reserve_hint(__base_);
+  // }
+  // constexpr auto reserve_hint() const
+  //   requires approximately_sized_range<const _View>
+  // {
+  //   return ranges::reserve_hint(__base_);
+  // }
+};
+
+template <class _Range>
+cache_latest_view(_Range&&) -> cache_latest_view<views::all_t<_Range>>;
+
+// [range.cache.latest.iterator]
+
+template <input_range _View>
+  requires view<_View>
+class cache_latest_view<_View>::iterator {
+  cache_latest_view* __parent_; // exposition only
+  iterator_t<_View> __current_; // exposition only
+
+  constexpr explicit iterator(cache_latest_view& __parent) // exposition only
+      : __parent_{std::addressof(__parent)}, __current_{ranges::begin(__parent.__base_)} {}
+
+  friend class cache_latest_view<_View>;
+
+public:
+  using difference_type  = range_difference_t<_View>;
+  using value_type       = range_value_t<_View>;
+  using iterator_concept = input_iterator_tag;
+
+  _LIBCPP_HIDE_FROM_ABI iterator(iterator&&)            = default;
+  _LIBCPP_HIDE_FROM_ABI iterator& operator=(iterator&&) = default;
+
+  _LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_View> __base() && { return std::move(__current_); }
+  _LIBCPP_HIDE_FROM_ABI constexpr const iterator_t<_View>& __base() const& noexcept { return __current_; }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr range_reference_t<_View>& operator*() const {
+    if constexpr (is_reference_v<range_reference_t<_View>>) {
+      if (!__parent_->__cache_.__has_value()) {
+        __parent_->__cache_.__emplace(std::addressof(__as_lvalue(*__current_)));
+      }
+      return **__parent_->__cache_;
+    } else {
+      if (!__parent_->__cache_.__has_value()) {
+        __parent_->__cache_.__emplace_from([&]() -> decltype(auto) { return *__current_; });
+      }
+      return *__parent_->__cache_;
+    }
+  }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr iterator& operator++() {
+    __parent_->__cache_.__reset();
+    ++__current_;
+    return *this;
+  }
+  _LIBCPP_HIDE_FROM_ABI constexpr void operator++(int) { ++*this; }
+
+  _LIBCPP_HIDE_FROM_ABI friend constexpr range_rvalue_reference_t<_View>
+  iter_move(const iterator& __i) noexcept(noexcept(ranges::iter_move(__i.__current_))) {
+    return ranges::iter_move(__i.__current_);
+  }
+
+  _LIBCPP_HIDE_FROM_ABI friend constexpr void
+  iter_swap(const iterator& __x,
+            const iterator& __y) noexcept(noexcept(ranges::iter_swap(__x.__current_, __y.__current_)))
+    requires indirectly_swappable<iterator_t<_View>>
+  {
+    ranges::iter_swap(__x.__current_, __y.__current_);
+  }
+};
+
+// [range.cache.latest.sentinel]
+
+template <input_range _View>
+  requires view<_View>
+class cache_latest_view<_View>::sentinel {
+  sentinel_t<_View> __end_ = sentinel_t<_View>(); // exposition only
+
+  constexpr explicit sentinel(cache_latest_view& __parent) // exposition only
+      : __end_{ranges::end(__parent.__base_)} {}
+
+  friend class cache_latest_view<_View>;
+
+public:
+  _LIBCPP_HIDE_FROM_ABI sentinel() = default;
+
+  _LIBCPP_HIDE_FROM_ABI constexpr sentinel_t<_View> base() const { return __end_; }
+
+  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const iterator& __x, const sentinel& __y) {
+    return __x.__base() == __y.__end_;
+  }
+
+  _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View> operator-(const iterator& __x, const sentinel& __y)
+    requires sized_sentinel_for<sentinel_t<_View>, iterator_t<_View>>
+  {
+    return __x.__current_ - __y.__end_;
+  }
+  _LIBCPP_HIDE_FROM_ABI friend constexpr range_difference_t<_View> operator-(const sentinel& __x, const iterator& __y)
+    requires sized_sentinel_for<sentinel_t<_View>, iterator_t<_View>>
+  {
+    return __x.__end_ - __y.__current_;
+  }
+};
+
+namespace views {
+namespace __cache_latest_view {
+
+struct __fn : __range_adaptor_closure<__fn> {
+  template <class _Range>
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
+  operator()(_Range&& __range) noexcept(noexcept(/**/ cache_latest_view(std::forward<_Range>(__range))))
+      -> decltype(/*-------------------------------*/ cache_latest_view(std::forward<_Range>(__range))) {
+    return /*--------------------------------------*/ cache_latest_view(std::forward<_Range>(__range));
+  }
+};
+
+} // namespace __cache_latest_view
+
+inline namespace __cpo {
+inline constexpr auto cache_latest = __cache_latest_view::__fn{};
+} // namespace __cpo
+} // namespace views
+} // namespace ranges
+
+#endif // _LIBCPP_STD_VER >= 26
+
+_LIBCPP_END_NAMESPACE_STD
+
+_LIBCPP_POP_MACROS
+
+#endif // _LIBCPP___RANGES_TO_CACHE_LATEST_VIEW_H
diff --git a/libcxx/include/__ranges/non_propagating_cache.h b/libcxx/include/__ranges/non_propagating_cache.h
index beae13a98e9e3..74bf1d188ecb4 100644
--- a/libcxx/include/__ranges/non_propagating_cache.h
+++ b/libcxx/include/__ranges/non_propagating_cache.h
@@ -91,6 +91,8 @@ class __non_propagating_cache {
   _LIBCPP_HIDE_FROM_ABI constexpr _Tp& __emplace(_Args&&... __args) {
     return __value_.emplace(__forward_tag{}, std::forward<_Args>(__args)...).__t_;
   }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr void __reset() { __value_.reset(); }
 };
 
 struct __empty_cache {};
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 117556edb5d20..3625790ceaaab 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -1851,6 +1851,7 @@ module std [system] {
     module access                         { header "__ranges/access.h" }
     module all                            { header "__ranges/all.h" }
     module as_rvalue_view                 { header "__ranges/as_rvalue_view.h" }
+    module cache_latest_view              { header "__ranges/cache_latest_view.h" }
     module chunk_by_view {
       header "__ranges/chunk_by_view.h"
       export std.functional.bind_back
diff --git a/libcxx/include/ranges b/libcxx/include/ranges
index 96d7a6b897188..3e3bde01a1b34 100644
--- a/libcxx/include/ranges
+++ b/libcxx/include/ranges
@@ -362,6 +362,13 @@ namespace std::ranges {
   class chunk_by_view;                                                      // C++23
 
   namespace views { inline constexpr unspecified chunk_by = unspecified; }  // C++23
+
+  // [range.cache.latest], cache latest view
+  template<input_range V>
+    requires view<V>
+  class cache_latest_view;                                                      // C++26
+
+  namespace views { inline constexpr unspecified cache_latest = unspecified; }  // C++26
 }
 
 namespace std {
@@ -453,6 +460,10 @@ namespace std {
 #    include <__ranges/zip_view.h>
 #  endif
 
+#  if _LIBCPP_STD_VER >= 26
+#    include <__ranges/cache_latest_view.h>
+#  endif
+
 #  include <version>
 
 // standard-mandated includes
diff --git a/libcxx/include/version b/libcxx/include/version
index d98049bd57046..685f6082a9709 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -200,6 +200,7 @@ __cpp_lib_ranges                                        202406L <algorithm> <fun
                                                         202110L // C++20
 __cpp_lib_ranges_as_const                               202207L <ranges>
 __cpp_lib_ranges_as_rvalue                              202207L <ranges>
+__cpp_lib_ranges_cache_latest                           202411L <ranges>
 __cpp_lib_ranges_chunk                                  202202L <ranges>
 __cpp_lib_ranges_chunk_by                               202202L <ranges>
 __cpp_lib_ranges_concat                                 202403L <ranges>
@@ -518,6 +519,7 @@ __cpp_lib_void_t                                        201411L <type_traits>
 # define __cpp_lib_ranges                               202406L
 // # define __cpp_lib_ranges_as_const                      202207L
 # define __cpp_lib_ranges_as_rvalue                     202207L
+# define __cpp_lib_ranges_cache_latest                  202411L
 // # define __cpp_lib_ranges_chunk                         202202L
 # define __cpp_lib_ranges_chunk_by                      202202L
 # define __cpp_lib_ranges_contains                      202207L
diff --git a/libcxx/modules/std/ranges.inc b/libcxx/modules/std/ranges.inc
index 7ede42e4f7b0a..1f09c8c5fdca1 100644
--- a/libcxx/modules/std/ranges.inc
+++ b/libcxx/modules/std/ranges.inc
@@ -351,6 +351,15 @@ export namespace std {
       using std::ranges::views::cartesian_product;
     }
 #endif
+
+#if _LIBCPP_STD_VER >= 26
+    // [range.cache.latest],  Cache latest view
+    using std::ranges::cache_latest_view;
+
+    namespace views {
+      using std::ranges::views::cache_latest;
+    }
+#endif
   } // namespace ranges
 
   namespace views = ranges::views;
diff --git a/libcxx/test/libcxx/ranges/range.nonprop.cache/reset.pass.cpp b/libcxx/test/libcxx/ranges/range.nonprop.cache/reset.pass.cpp
new file mode 100644
index 0000000000000..be00d58359245
--- /dev/null
+++ b/libcxx/test/libcxx/ranges/range.nonprop.cache/reset.pass.cpp
@@ -0,0 +1,52 @@
+//===----------------------------------------------------------------------===//
+//
+// 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 void __reset();
+
+#include <ranges>
+
+#include <cassert>
+
+template <class T>
+constexpr void test() {
+  using Cache = std::ranges::__non_propagating_cache<T>;
+
+  // __reset on an empty cache
+  {
+    Cache cache;
+    assert(!cache.__has_value());
+    cache.__reset();
+    assert(!cache.__has_value());
+  }
+
+  // __reset on a non-empty cache
+  {
+    Cache cache;
+    cache.__emplace();
+    assert(cache.__has_value());
+    cache.__reset();
+    assert(!cache.__has_value());
+  }
+}
+
+struct T {};
+
+constexpr bool tests() {
+  test<T>();
+  test<int>();
+  return true;
+}
+
+int main(int, char**) {
+  tests();
+  static_assert(tests());
+
+  return 0;
+}
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp
index df19f03e7dba1..dab58019979a1 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp
@@ -36,6 +36,10 @@
 #    error "__cpp_lib_ranges_as_rvalue should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should not be defined before c++23"
+#  endif
+
 #  ifdef __cpp_lib_ranges_chunk
 #    error "__cpp_lib_ranges_chunk should not be defined before c++23"
 #  endif
@@ -86,6 +90,10 @@
 #    error "__cpp_lib_ranges_as_rvalue should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should not be defined before c++23"
+#  endif
+
 #  ifdef __cpp_lib_ranges_chunk
 #    error "__cpp_lib_ranges_chunk should not be defined before c++23"
 #  endif
@@ -136,6 +144,10 @@
 #    error "__cpp_lib_ranges_as_rvalue should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should not be defined before c++23"
+#  endif
+
 #  ifdef __cpp_lib_ranges_chunk
 #    error "__cpp_lib_ranges_chunk should not be defined before c++23"
 #  endif
@@ -189,6 +201,10 @@
 #    error "__cpp_lib_ranges_as_rvalue should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should not be defined before c++23"
+#  endif
+
 #  ifdef __cpp_lib_ranges_chunk
 #    error "__cpp_lib_ranges_chunk should not be defined before c++23"
 #  endif
@@ -254,6 +270,13 @@
 #    error "__cpp_lib_ranges_as_rvalue should have the value 202207L in c++23"
 #  endif
 
+#  ifndef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should be defined in c++23"
+#  endif
+#  if __cpp_lib_ranges_cache_latest != 202411L
+#    error "__cpp_lib_ranges_cache_latest should have the value 202411L in c++23"
+#  endif
+
 #  if !defined(_LIBCPP_VERSION)
 #    ifndef __cpp_lib_ranges_chunk
 #      error "__cpp_lib_ranges_chunk should be defined in c++23"
@@ -367,6 +390,13 @@
 #    error "__cpp_lib_ranges_as_rvalue should have the value 202207L in c++26"
 #  endif
 
+#  ifndef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should be defined in c++26"
+#  endif
+#  if __cpp_lib_ranges_cache_latest != 202411L
+#    error "__cpp_lib_ranges_cache_latest should have the value 202411L in c++26"
+#  endif
+
 #  if !defined(_LIBCPP_VERSION)
 #    ifndef __cpp_lib_ranges_chunk
 #      error "__cpp_lib_ranges_chunk should be defined in c++26"
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
index 962688e06188a..e6092d0c4b4b6 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
@@ -644,6 +644,10 @@
 #    error "__cpp_lib_ranges_as_rvalue should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should not be defined before c++23"
+#  endif
+
 #  ifdef __cpp_lib_ranges_chunk
 #    error "__cpp_lib_ranges_chunk should not be defined before c++23"
 #  endif
@@ -1584,6 +1588,10 @@
 #    error "__cpp_lib_ranges_as_rvalue should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_cache_latest
+#    error "__cpp_lib_ranges_cache_latest should not be defined before c++23"
+#  endif
+
 #  ifdef __cpp_lib_ranges_chunk
 #    error "__cpp_lib_ranges_chunk should not be defined before c++23"
 #  endif
@@ -2695,6 +2703,10 @@
 #    error "__cpp_lib_ranges_as_rvalue should not be defined bef...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/151450


More information about the libcxx-commits mailing list