Skip to content

Commit 5bdee0d

Browse files
Xiaoyang LiuAlexisPerry
authored andcommitted
[libc++] P3029R1: Better mdspan's CTAD - std::extents (llvm#89015)
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`.
1 parent a174440 commit 5bdee0d

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

libcxx/include/__mdspan/extents.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,15 @@ template <class _IndexType, size_t _Rank>
455455
using dextents = typename __mdspan_detail::__make_dextents<_IndexType, _Rank>::type;
456456

457457
// Deduction guide for extents
458+
# if _LIBCPP_STD_VER >= 26
458459
template <class... _IndexTypes>
459-
extents(_IndexTypes...) -> extents<size_t, size_t(((void)sizeof(_IndexTypes), dynamic_extent))...>;
460+
requires(is_convertible_v<_IndexTypes, size_t> && ...)
461+
explicit extents(_IndexTypes...) -> extents<size_t, __maybe_static_ext<_IndexTypes>...>;
462+
# else
463+
template <class... _IndexTypes>
464+
requires(is_convertible_v<_IndexTypes, size_t> && ...)
465+
explicit extents(_IndexTypes...) -> extents<size_t, size_t(((void)sizeof(_IndexTypes), dynamic_extent))...>;
466+
# endif
460467

461468
namespace __mdspan_detail {
462469

libcxx/test/std/containers/views/mdspan/extents/ctad.pass.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
// explicit extents(Integrals...) -> see below;
1414
// Constraints: (is_convertible_v<Integrals, size_t> && ...) is true.
1515
//
16-
// Remarks: The deduced type is dextents<size_t, sizeof...(Integrals)>.
16+
// Remarks: The deduced type is dextents<size_t, sizeof...(Integrals)>. // until C++26
17+
// Remarks: The deduced type is extents<size_t, maybe-static-ext<Integrals>...>. // since C++26
1718

1819
#include <mdspan>
1920
#include <cassert>
21+
#include <type_traits>
2022

2123
#include "../ConvertibleToIntegral.h"
2224
#include "test_macros.h"
@@ -43,6 +45,15 @@ constexpr bool test() {
4345
test(std::extents(1, 2u, 3, 4, 5, 6, 7, 8, 9),
4446
std::extents<std::size_t, D, D, D, D, D, D, D, D, D>(1, 2u, 3, 4, 5, 6, 7, 8, 9));
4547
test(std::extents(NoDefaultCtorIndex{1}, NoDefaultCtorIndex{2}), std::extents<std::size_t, D, D>(1, 2));
48+
49+
#if _LIBCPP_STD_VER >= 26
50+
// P3029R1: deduction from `integral_constant`
51+
test(std::extents(std::integral_constant<size_t, 5>{}), std::extents<std::size_t, 5>());
52+
test(std::extents(std::integral_constant<size_t, 5>{}, 6), std::extents<std::size_t, 5, std::dynamic_extent>(6));
53+
test(std::extents(std::integral_constant<size_t, 5>{}, 6, std::integral_constant<size_t, 7>{}),
54+
std::extents<std::size_t, 5, std::dynamic_extent, 7>(6));
55+
#endif
56+
4657
return true;
4758
}
4859

0 commit comments

Comments
 (0)