[libcxx-commits] [libcxx] WIP [libc++][ranges] P3137R3: `views::to_input` (PR #151449)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jul 31 07:43:04 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/P3137R3

Closes #<!-- -->127873

# References

- https://wg21.link/range.to.input

---

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


24 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/to_input_view.h (+221) 
- (modified) libcxx/include/module.modulemap.in (+3) 
- (modified) libcxx/include/ranges (+15) 
- (modified) libcxx/include/version (+2) 
- (modified) libcxx/modules/std/ranges.inc (+10) 
- (modified) libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp (+27) 
- (modified) libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp (+27) 
- (modified) libcxx/test/std/library/description/conventions/customization.point.object/cpo.compile.pass.cpp (+1-1) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/adaptor.pass.cpp (+257) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/base.pass.cpp (+85) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/begin.pass.cpp (+25) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/ctad.compile.pass.cpp (+30) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/ctor.default.pass.cpp (+81) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/ctor.view.pass.cpp (+24) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/enable_borrowed_range.compile.pass.cpp (+37) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/end.pass.cpp (+25) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/general.pass.cpp (+67) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/iterator/ctor.default.pass.cpp (+80) 
- (added) libcxx/test/std/ranges/range.adaptors/range.to_input/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..4a54d6c2a5679 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -488,6 +488,8 @@ Status
     ---------------------------------------------------------- -----------------
     ``__cpp_lib_ranges_concat``                                *unimplemented*
     ---------------------------------------------------------- -----------------
+    ``__cpp_lib_ranges_to_input``                              ``202502L``
+    ---------------------------------------------------------- -----------------
     ``__cpp_lib_ratio``                                        ``202306L``
     ---------------------------------------------------------- -----------------
     ``__cpp_lib_rcu``                                          *unimplemented*
diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index 15bf46d44b07f..e468277fa76ad 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)
+- P3137R3: ``views::to_input`` (`Github <https://github.com/llvm/llvm-project/issues/127873>`__)
 
 Improvements and New Features
 -----------------------------
diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv
index febb0c176f9c4..9a3b30d99c5e1 100644
--- a/libcxx/docs/Status/Cxx2cPapers.csv
+++ b/libcxx/docs/Status/Cxx2cPapers.csv
@@ -101,7 +101,7 @@
 "`P2900R14 <https://wg21.link/P2900R14>`__","Contracts for C++","2025-02 (Hagenberg)","","",""
 "`P3475R2 <https://wg21.link/P3475R2>`__","Defang and deprecate ``memory_order::consume``","2025-02 (Hagenberg)","","",""
 "`P2786R13 <https://wg21.link/P2786R13>`__","Trivial Relocatability For C++26","2025-02 (Hagenberg)","","",""
-"`P3137R3 <https://wg21.link/P3137R3>`__","``views::to_input``","2025-02 (Hagenberg)","","",""
+"`P3137R3 <https://wg21.link/P3137R3>`__","``views::to_input``","2025-02 (Hagenberg)","|Complete|","22",""
 "`P0472R3 <https://wg21.link/P0472R3>`__","Put ``std::monostate`` in ``<utility>``","2025-02 (Hagenberg)","|Complete|","21",""
 "`P3349R1 <https://wg21.link/P3349R1>`__","Converting contiguous iterators to pointers","2025-02 (Hagenberg)","","",""
 "`P3372R3 <https://wg21.link/P3372R3>`__","constexpr containers and adaptors","2025-02 (Hagenberg)","|In Progress|","",""
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index ed5475141b50a..4bfc0d81f65bf 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -735,6 +735,7 @@ set(files
   __ranges/take_view.h
   __ranges/take_while_view.h
   __ranges/to.h
+  __ranges/to_input_view.h
   __ranges/transform_view.h
   __ranges/view_interface.h
   __ranges/views.h
diff --git a/libcxx/include/__ranges/to_input_view.h b/libcxx/include/__ranges/to_input_view.h
new file mode 100644
index 0000000000000..433bc9ad8cc0f
--- /dev/null
+++ b/libcxx/include/__ranges/to_input_view.h
@@ -0,0 +1,221 @@
+// -*- 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_INPUT_VIEW_H
+#define _LIBCPP___RANGES_TO_INPUT_VIEW_H
+
+#include <__concepts/constructible.h>
+#include <__concepts/convertible_to.h>
+#include <__config>
+#include <__iterator/concepts.h>
+#include <__iterator/iter_move.h>
+#include <__iterator/iter_swap.h>
+#include <__iterator/iterator_traits.h>
+#include <__ranges/access.h>
+#include <__ranges/all.h>
+#include <__ranges/concepts.h>
+#include <__ranges/size.h>
+#include <__ranges/view_interface.h>
+#include <__type_traits/maybe_const.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.to.input.view
+
+template <input_range _View>
+  requires view<_View>
+class to_input_view : public view_interface<to_input_view<_View>> {
+  _View __base_ = _View(); // exposition only
+
+  // [range.to.input.iterator], class template to_input_view::iterator
+  template <bool _Const>
+  class iterator; // exposition only
+
+public:
+  _LIBCPP_HIDE_FROM_ABI to_input_view()
+    requires default_initializable<_View>
+  = default;
+  _LIBCPP_HIDE_FROM_ABI constexpr explicit to_input_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()
+    requires(!__simple_view<_View>)
+  {
+    return iterator<false>{ranges::begin(__base_)};
+  }
+  _LIBCPP_HIDE_FROM_ABI constexpr auto begin() const
+    requires range<const _View>
+  {
+    return iterator<true>{ranges::begin(__base_)};
+  }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr auto end()
+    requires(!__simple_view<_View>)
+  {
+    return ranges::end(__base_);
+  }
+  _LIBCPP_HIDE_FROM_ABI constexpr auto end() const
+    requires range<const _View>
+  {
+    return ranges::end(__base_);
+  }
+  _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>
+to_input_view(_Range&&) -> to_input_view<views::all_t<_Range>>;
+
+// [range.to.input.iterator]
+
+template <input_range _View>
+  requires view<_View>
+template <bool _Const>
+class to_input_view<_View>::iterator {
+  using _Base = __maybe_const<_Const, _View>; // exposition only
+
+  iterator_t<_Base> __current_ = iterator_t<_Base>(); // exposition only
+
+  constexpr explicit iterator(iterator_t<_Base> __current) : __current_(std::move(__current)) {} // exposition only
+
+  friend class to_input_view<_View>;
+
+public:
+  using difference_type  = range_difference_t<_Base>;
+  using value_type       = range_value_t<_Base>;
+  using iterator_concept = input_iterator_tag;
+
+  _LIBCPP_HIDE_FROM_ABI iterator()
+    requires default_initializable<iterator_t<_Base>>
+  = default;
+
+  _LIBCPP_HIDE_FROM_ABI iterator(iterator&&)            = default;
+  _LIBCPP_HIDE_FROM_ABI iterator& operator=(iterator&&) = default;
+
+  _LIBCPP_HIDE_FROM_ABI constexpr iterator(iterator<!_Const> __i)
+    requires _Const && convertible_to<iterator_t<_View>, iterator_t<_Base>>
+      : __current_(std::move(__i.__current_)) {}
+
+  _LIBCPP_HIDE_FROM_ABI constexpr iterator_t<_Base> base() && { return std::move(__current_); }
+  _LIBCPP_HIDE_FROM_ABI constexpr const iterator_t<_Base>& base() const& noexcept { return __current_; }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator*() const { return *__current_; }
+
+  _LIBCPP_HIDE_FROM_ABI constexpr iterator& operator++() {
+    ++__current_;
+    return *this;
+  }
+  _LIBCPP_HIDE_FROM_ABI constexpr void operator++(int) { ++*this; }
+
+  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const iterator& __x, const sentinel_t<_Base>& __y) {
+    return __x.__current_ == __y;
+  }
+
+  _LIBCPP_HIDE_FROM_ABI friend constexpr difference_type operator-(const sentinel_t<_Base>& __y, const iterator& __x)
+    requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
+  {
+    return __y - __x.__current_;
+  }
+  _LIBCPP_HIDE_FROM_ABI friend constexpr difference_type operator-(const iterator& __x, const sentinel_t<_Base>& __y)
+    requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base>>
+  {
+    return __x.__current_ - __y;
+  }
+
+  _LIBCPP_HIDE_FROM_ABI friend constexpr range_rvalue_reference_t<_Base> _LIBCPP_HIDE_FROM_ABI
+  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<_Base>>
+  {
+    ranges::iter_swap(__x.__current_, __y.__current_);
+  }
+};
+
+template <class _View>
+constexpr bool enable_borrowed_range<to_input_view<_View>> = enable_borrowed_range<_View>;
+
+namespace views {
+namespace __to_input_view {
+
+struct __fn : __range_adaptor_closure<__fn> {
+  template <class _Range>
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
+  operator()(_Range&& __range) noexcept(noexcept(/**/ to_input_view(std::forward<_Range>(__range))))
+      -> decltype(/*--*/ to_input_view(std::forward<_Range>(__range))) {
+    return /*---------*/ to_input_view(std::forward<_Range>(__range));
+  }
+
+  template <class _Range>
+    requires(!common_range<_Range> && !forward_range<_Range>)
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr auto
+  operator()(_Range&& __range) noexcept(noexcept(views::all(std::forward<_Range>(__range))))
+      -> decltype(/*--------------------------*/ views::all(std::forward<_Range>(__range))) {
+    return /*---------------------------------*/ views::all(std::forward<_Range>(__range));
+  }
+};
+
+} // namespace __to_input_view
+
+inline namespace __cpo {
+inline constexpr auto to_input = __to_input_view::__fn{};
+} // namespace __cpo
+} // namespace views
+} // namespace ranges
+
+#endif // _LIBCPP_STD_VER >= 26
+
+_LIBCPP_END_NAMESPACE_STD
+
+_LIBCPP_POP_MACROS
+
+#endif // _LIBCPP___RANGES_TO_INPUT_VIEW_H
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 117556edb5d20..96680c505699f 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -1929,6 +1929,9 @@ module std [system] {
       header "__ranges/to.h"
       export std.functional.bind_back
     }
+    module to_input_view {
+      header "__ranges/to_input_view.h"
+    }
     module transform_view {
       header "__ranges/transform_view.h"
       export std.functional.bind_back
diff --git a/libcxx/include/ranges b/libcxx/include/ranges
index 96d7a6b897188..2855377f8165a 100644
--- a/libcxx/include/ranges
+++ b/libcxx/include/ranges
@@ -362,6 +362,17 @@ namespace std::ranges {
   class chunk_by_view;                                                      // C++23
 
   namespace views { inline constexpr unspecified chunk_by = unspecified; }  // C++23
+
+  // [range.to.input], to input view
+  template<input_range V>
+    requires view<V>
+  class to_input_view;                                                      // C++26
+
+  template<class V>
+    constexpr bool enable_borrowed_range<to_input_view<V>> =
+      enable_borrowed_range<V>;                                             // C++26
+
+  namespace views { inline constexpr unspecified to_input = unspecified; }  // C++26
 }
 
 namespace std {
@@ -453,6 +464,10 @@ namespace std {
 #    include <__ranges/zip_view.h>
 #  endif
 
+#  if _LIBCPP_STD_VER >= 26
+#    include <__ranges/to_input_view.h>
+#  endif
+
 #  include <version>
 
 // standard-mandated includes
diff --git a/libcxx/include/version b/libcxx/include/version
index d98049bd57046..1bfce9578f3a6 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -211,6 +211,7 @@ __cpp_lib_ranges_repeat                                 202207L <ranges>
 __cpp_lib_ranges_slide                                  202202L <ranges>
 __cpp_lib_ranges_starts_ends_with                       202106L <algorithm>
 __cpp_lib_ranges_to_container                           202202L <ranges>
+__cpp_lib_ranges_to_input                               202502L <ranges>
 __cpp_lib_ranges_zip                                    202110L <ranges> <tuple> <utility>
 __cpp_lib_ratio                                         202306L <ratio>
 __cpp_lib_raw_memory_algorithms                         201606L <memory>
@@ -590,6 +591,7 @@ __cpp_lib_void_t                                        201411L <type_traits>
 # define __cpp_lib_out_ptr                              202311L
 // # define __cpp_lib_philox_engine                        202406L
 // # define __cpp_lib_ranges_concat                        202403L
+# define __cpp_lib_ranges_to_input                      202502L
 # define __cpp_lib_ratio                                202306L
 // # define __cpp_lib_rcu                                  202306L
 # define __cpp_lib_reference_wrapper                    202403L
diff --git a/libcxx/modules/std/ranges.inc b/libcxx/modules/std/ranges.inc
index 7ede42e4f7b0a..fb79dcfd35019 100644
--- a/libcxx/modules/std/ranges.inc
+++ b/libcxx/modules/std/ranges.inc
@@ -351,6 +351,16 @@ export namespace std {
       using std::ranges::views::cartesian_product;
     }
 #endif
+
+#if _LIBCPP_STD_VER >= 26
+    // [range.to.input], to input view
+    using std::ranges::to_input_view;
+
+    namespace views {
+      using std::ranges::views::to_input;
+    }
+#endif
+
   } // namespace ranges
 
   namespace views = ranges::views;
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..4235bd3ca2383 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
@@ -64,6 +64,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -114,6 +118,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -164,6 +172,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -217,6 +229,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -312,6 +328,10 @@
 #    error "__cpp_lib_ranges_to_container should have the value 202202L in c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  if !defined(_LIBCPP_VERSION)
 #    ifndef __cpp_lib_ranges_zip
 #      error "__cpp_lib_ranges_zip should be defined in c++23"
@@ -434,6 +454,13 @@
 #    error "__cpp_lib_ranges_to_container should have the value 202202L in c++26"
 #  endif
 
+#  ifndef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should be defined in c++26"
+#  endif
+#  if __cpp_lib_ranges_to_input != 202502L
+#    error "__cpp_lib_ranges_to_input should have the value 202502L in c++26"
+#  endif
+
 #  if !defined(_LIBCPP_VERSION)
 #    ifndef __cpp_lib_ranges_zip
 #      error "__cpp_lib_ranges_zip 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..99b187984c6af 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
@@ -688,6 +688,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -1628,6 +1632,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -2739,6 +2747,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -4123,6 +4135,10 @@
 #    error "__cpp_lib_ranges_to_container should not be defined before c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  ifdef __cpp_lib_ranges_zip
 #    error "__cpp_lib_ranges_zip should not be defined before c++23"
 #  endif
@@ -5726,6 +5742,10 @@
 #    error "__cpp_lib_ranges_to_container should have the value 202202L in c++23"
 #  endif
 
+#  ifdef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should not be defined before c++26"
+#  endif
+
 #  if !defined(_LIBCPP_VERSION)
 #    ifndef __cpp_lib_ranges_zip
 #      error "__cpp_lib_ranges_zip should be defined in c++23"
@@ -7650,6 +7670,13 @@
 #    error "__cpp_lib_ranges_to_container should have the value 202202L in c++26"
 #  endif
 
+#  ifndef __cpp_lib_ranges_to_input
+#    error "__cpp_lib_ranges_to_input should be defined in c++26"
+#  endif
+#  if __cpp_lib_ranges_to_input != 202502L
+#    error "__cpp_lib_ranges_to_input should have the value 202502L in c++26"
+#  endif
+
 #  if !defined(_LIBCPP_VERSION)
 #    ifndef __cpp_lib_ranges_zip
 #      error "__cpp_lib_ranges_zip should be defined in c++26"
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..038c6c39ee99e 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
@@ -130,5 +130,5 @@ static_assert(test(std::views::zip, a, a));
 #if TEST_STD_VER >= 26
 // static_assert(test(std::views::cache_latest, a));
 // static_assert(test(std::views::concat, a, a));
-// static_assert(test(std::views::to_input, a));
+static_assert(test(std::views::to_input, a));
 #endif
diff --git a/libcxx/test/std/ranges/range.adaptors/range.to_input/adaptor.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.to_input/adaptor.pass.cpp
new file mode 100644
index 0000000000000..675d561682e5c
--- /dev/null
+++ b/libcxx/test/std/ranges/range.adaptors/...
[truncated]

``````````

</details>


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


More information about the libcxx-commits mailing list