-
Notifications
You must be signed in to change notification settings - Fork 14.9k
WIP [libc++][ranges] P3137R3: views::to_input
#151449
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
H-G-Hristov
wants to merge
1
commit into
llvm:main
Choose a base branch
from
H-G-Hristov:hgh/libcxx/P3137R3-views_to_input
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
WIP [libc++][ranges] P3137R3: views::to_input
#151449
H-G-Hristov
wants to merge
1
commit into
llvm:main
from
H-G-Hristov:hgh/libcxx/P3137R3-views_to_input
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
✅ With the latest revision this PR passed the Python code formatter. |
08c7d1c
to
3715bf4
Compare
@llvm/pr-subscribers-libcxx Author: Hristo Hristov (H-G-Hristov) ChangesImplements: https://wg21.link/P3137R3 Closes #127873 ReferencesPatch is 50.05 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/151449.diff 24 Files Affected:
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]
|
3715bf4
to
2977ae9
Compare
2977ae9
to
f78d23d
Compare
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Implements: https://wg21.link/P3137R3
Closes #127873
References