Skip to content

Commit b0c769a

Browse files
authored
[libc++][mdspan] Fix extents CTAD (#68737)
extents CTAD was requiring default constructibility of the extent arguments due to the way we implemented a pack expansion. This requirement is not in the standard. Reported in issue #68671 #68671 by @hewillk. Fixes #68671
1 parent 64d78d8 commit b0c769a

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

libcxx/include/__mdspan/extents.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ using dextents = typename __mdspan_detail::__make_dextents<_IndexType, _Rank>::t
456456

457457
// Deduction guide for extents
458458
template <class... _IndexTypes>
459-
extents(_IndexTypes...) -> extents<size_t, size_t((_IndexTypes(), dynamic_extent))...>;
459+
extents(_IndexTypes...) -> extents<size_t, size_t(((void)sizeof(_IndexTypes), dynamic_extent))...>;
460460

461461
namespace __mdspan_detail {
462462

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121
#include "../ConvertibleToIntegral.h"
2222
#include "test_macros.h"
2323

24+
struct NoDefaultCtorIndex {
25+
size_t value;
26+
constexpr NoDefaultCtorIndex() = delete;
27+
constexpr NoDefaultCtorIndex(size_t val) : value(val){};
28+
constexpr operator size_t() const noexcept { return value; }
29+
};
30+
2431
template <class E, class Expected>
2532
constexpr void test(E e, Expected expected) {
2633
ASSERT_SAME_TYPE(E, Expected);
@@ -35,6 +42,7 @@ constexpr bool test() {
3542
test(std::extents(1, 2u), std::extents<std::size_t, D, D>(1, 2u));
3643
test(std::extents(1, 2u, 3, 4, 5, 6, 7, 8, 9),
3744
std::extents<std::size_t, D, D, D, D, D, D, D, D, D>(1, 2u, 3, 4, 5, 6, 7, 8, 9));
45+
test(std::extents(NoDefaultCtorIndex{1}, NoDefaultCtorIndex{2}), std::extents<std::size_t, D, D>(1, 2));
3846
return true;
3947
}
4048

0 commit comments

Comments
 (0)