-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[libc++] P3029R1: Better mdspan
's CTAD - std::extents
#89015
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
Conversation
@llvm/pr-subscribers-libcxx Author: Xiaoyang Liu (xiaoyang-sde) ChangesAbstractThis pull request implements an improvement introduced in P3029R1 that was ignored in #87873. The proposed change suggests deducing static extents if ReferenceFull diff: https://github.com/llvm/llvm-project/pull/89015.diff 2 Files Affected:
diff --git a/libcxx/include/__mdspan/extents.h b/libcxx/include/__mdspan/extents.h
index f6bcd940ee6077..d5f4a96f9f0891 100644
--- a/libcxx/include/__mdspan/extents.h
+++ b/libcxx/include/__mdspan/extents.h
@@ -455,8 +455,15 @@ template <class _IndexType, size_t _Rank>
using dextents = typename __mdspan_detail::__make_dextents<_IndexType, _Rank>::type;
// Deduction guide for extents
+# if _LIBCPP_STD_VER >= 26
template <class... _IndexTypes>
-extents(_IndexTypes...) -> extents<size_t, size_t(((void)sizeof(_IndexTypes), dynamic_extent))...>;
+ requires(is_convertible_v<_IndexTypes, size_t> && ...)
+explicit extents(_IndexTypes...) -> extents<size_t, __maybe_static_ext<_IndexTypes>...>;
+# else
+template <class... _IndexTypes>
+ requires(is_convertible_v<_IndexTypes, size_t> && ...)
+explicit extents(_IndexTypes...) -> extents<size_t, size_t(((void)sizeof(_IndexTypes), dynamic_extent))...>;
+# endif
namespace __mdspan_detail {
diff --git a/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp b/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp
index 3f99d8a3b47a2e..9144bb6812e3cc 100644
--- a/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp
+++ b/libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp
@@ -13,10 +13,12 @@
// explicit extents(Integrals...) -> see below;
// Constraints: (is_convertible_v<Integrals, size_t> && ...) is true.
//
-// Remarks: The deduced type is dextents<size_t, sizeof...(Integrals)>.
+// Remarks: The deduced type is dextents<size_t, sizeof...(Integrals)>. // until C++26
+// Remarks: The deduced type is extents<size_t, maybe-static-ext<Integrals>...>. // since C++26
#include <mdspan>
#include <cassert>
+#include <type_traits>
#include "../ConvertibleToIntegral.h"
#include "test_macros.h"
@@ -43,6 +45,15 @@ constexpr bool test() {
test(std::extents(1, 2u, 3, 4, 5, 6, 7, 8, 9),
std::extents<std::size_t, D, D, D, D, D, D, D, D, D>(1, 2u, 3, 4, 5, 6, 7, 8, 9));
test(std::extents(NoDefaultCtorIndex{1}, NoDefaultCtorIndex{2}), std::extents<std::size_t, D, D>(1, 2));
+
+#if _LIBCPP_STD_VER >= 26
+ // P3029R1: deduction from `integral_constant`
+ test(std::extents(std::integral_constant<size_t, 5>{}), std::extents<std::size_t, 5>());
+ test(std::extents(std::integral_constant<size_t, 5>{}, 6), std::extents<std::size_t, 5, std::dynamic_extent>(6));
+ test(std::extents(std::integral_constant<size_t, 5>{}, 6, std::integral_constant<size_t, 7>{}),
+ std::extents<std::size_t, 5, std::dynamic_extent, 7>(6));
+#endif
+
return true;
}
|
template <class... _IndexTypes> | ||
extents(_IndexTypes...) -> extents<size_t, size_t(((void)sizeof(_IndexTypes), dynamic_extent))...>; | ||
requires(is_convertible_v<_IndexTypes, size_t> && ...) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uh, this line isn't really changed by P3029R1. Looks like that it's already needed in C++23 but previously missing.
Would it be better to make only __maybe_static_ext<_IndexTypes>...
and size_t(((void)sizeof(_IndexTypes), dynamic_extent))...
(or the deduced extents<...>
) guarded by #if
? @mordante
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this line is a drive-by change that applies to both C++23 and C++26.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks LGTM!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you also rebase the patch on main?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you rebase again, it seems the CI failed the last time. (I kind of lost track of this patch, sorry.)
24e292d
to
816e3a4
Compare
It seems that the CI checks failed in several recent pull requests. |
This patch implements an improvement introduced in P3029R1 that was missed in llvm#87873. It adds a deduction of static extents if integral_constant-like constants are passed to `std::extents`.
Abstract
This pull request implements an improvement introduced in P3029R1 that was ignored in #87873. The proposed change suggests deducing static extents if
integral_constant
-like constants are passed tostd::extents
.Reference