-
Notifications
You must be signed in to change notification settings - Fork 14.9k
WIP [libc++][ranges] P3138R3: views::cache_latest
#151450
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/P3138R3-views_cache_latest
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] P3138R3: views::cache_latest
#151450
H-G-Hristov
wants to merge
1
commit into
llvm:main
from
H-G-Hristov:hgh/libcxx/P3138R3-views_cache_latest
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
e74ffa8
to
8de1352
Compare
@llvm/pr-subscribers-libcxx Author: Hristo Hristov (H-G-Hristov) ChangesImplements: https://wg21.link/P3138R3 Closes #118134 ReferencesPatch is 50.67 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/151450.diff 25 Files Affected:
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]
|
110aa1b
to
89cee3d
Compare
89cee3d
to
49f5b6e
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/P3138R3
Closes #118134
References