<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, Jul 7, 2026 at 12:21 PM Tomasz Kamiński <<a href="mailto:tkaminsk@redhat.com">tkaminsk@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Converting the __strides values using __index_type_cast asserts<br>
that they are non-negative and each value is representable as<br>
index_type.<br>
<br>
libstdc++-v3/ChangeLog:<br>
<br>
        * include/std/mdspan<br>
        (layout_stride::mapping::mapping(const extent_type&, span<...>):<br>
        Convert strides using __index_type_cast, which bring asserts<br>
        for negative and unrepresentable values.<br>
        * testsuite/23_containers/mdspan/layouts/stride_neg.cc: New test.<br>
---<br>
Tested on x86_64-linux locally. OK for trunk?<br>
<br>
 libstdc++-v3/include/std/mdspan               |  3 +-<br>
 .../mdspan/layouts/stride_neg.cc              | 31 +++++++++++++++++++<br>
 2 files changed, 33 insertions(+), 1 deletion(-)<br>
 create mode 100644 libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc<br>
<br>
diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan<br>
index f5556f35fa1..5e1c4d8b1a4 100644<br>
--- a/libstdc++-v3/include/std/mdspan<br>
+++ b/libstdc++-v3/include/std/mdspan<br>
@@ -1891,7 +1891,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
        : _M_extents(__exts)<br>
        {<br>
          for (size_t __i = 0; __i < extents_type::rank(); ++__i)<br>
-           _M_strides[__i] = index_type(as_const(__strides[__i]));<br>
+           _M_strides[__i]<br>
+              = __mdspan::__index_type_cast<index_type>(__strides[__i]);<br></blockquote><div>Before committing, I will restore as_const call here, to match types that do not have const-conversion,</div><div>to match standard to the letter.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
        }<br>
<br>
       template<typename _OIndexType><br>
diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc<br>
new file mode 100644<br>
index 00000000000..153560bc82f<br>
--- /dev/null<br>
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc<br>
@@ -0,0 +1,31 @@<br>
+// { dg-do compile { target c++23 } }<br>
+#include <mdspan><br>
+<br>
+#include "../layout_traits.h"<br>
+#include <cstdint><br>
+<br>
+constexpr size_t dyn = std::dynamic_extent;<br>
+<br>
+constexpr bool<br>
+test_stride_overflow()<br>
+{<br>
+  auto exts = std::extents<uint8_t, dyn, dyn>(1, 3);<br>
+  auto n = size_t(1) << 9;<br>
+  auto m = std::layout_stride::mapping(exts, std::array{n, 1zu}); // { dg-error "expansion of" }<br>
+  (void) m;<br>
+  return true;<br>
+}<br>
+static_assert(test_stride_overflow()); // { dg-error "expansion of" }<br>
+<br>
+constexpr bool<br>
+test_stride_negative()<br>
+{<br>
+  auto exts = std::extents<std::size_t, dyn, dyn>(1, 3);<br>
+  auto m = std::layout_stride::mapping(exts, std::array{1, -4}); // { dg-error "expansion of" } <br>
+  (void) m;<br>
+  return true;<br>
+}<br>
+static_assert(test_stride_negative()); // { dg-error "expansion of" } <br>
+<br>
+// { dg-prune-output "non-constant condition for static assertion" }<br>
+// { dg-prune-output "__glibcxx_assert_fail()" }<br>
-- <br>
2.54.0<br>
<br>
</blockquote></div></div>