On Tue, Jul 7, 2026 at 2:08 PM Tomasz Kaminski <[email protected]> wrote:
> > > On Tue, Jul 7, 2026 at 1:59 PM Jonathan Wakely <[email protected]> wrote: > >> On Tue, 7 Jul 2026 at 11:21, Tomasz Kamiński <[email protected]> wrote: >> > >> > Converting the __strides values using __index_type_cast asserts >> > that they are non-negative and each value is representable as >> > index_type. >> > >> > libstdc++-v3/ChangeLog: >> > >> > * include/std/mdspan >> > (layout_stride::mapping::mapping(const extent_type&, span<...>): >> > Convert strides using __index_type_cast, which bring asserts >> > for negative and unrepresentable values. >> > * testsuite/23_containers/mdspan/layouts/stride_neg.cc: New >> test. >> > --- >> > Tested on x86_64-linux locally. OK for trunk? >> >> OK for trunk. I think this makes sense for gcc-16 too? >> > Yes, once LWG4603 is approved. I will submit PR for it this week. > As Mark and I are still clarifying the uniqueness condition, I will backport only this patch to GCC-16. > >> > >> > libstdc++-v3/include/std/mdspan | 3 +- >> > .../mdspan/layouts/stride_neg.cc | 31 +++++++++++++++++++ >> > 2 files changed, 33 insertions(+), 1 deletion(-) >> > create mode 100644 >> libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc >> > >> > diff --git a/libstdc++-v3/include/std/mdspan >> b/libstdc++-v3/include/std/mdspan >> > index f5556f35fa1..5e1c4d8b1a4 100644 >> > --- a/libstdc++-v3/include/std/mdspan >> > +++ b/libstdc++-v3/include/std/mdspan >> > @@ -1891,7 +1891,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> > : _M_extents(__exts) >> > { >> > for (size_t __i = 0; __i < extents_type::rank(); ++__i) >> > - _M_strides[__i] = index_type(as_const(__strides[__i])); >> > + _M_strides[__i] >> > + = >> __mdspan::__index_type_cast<index_type>(__strides[__i]); >> > } >> > >> > template<typename _OIndexType> >> > diff --git >> a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc >> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc >> > new file mode 100644 >> > index 00000000000..153560bc82f >> > --- /dev/null >> > +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/stride_neg.cc >> > @@ -0,0 +1,31 @@ >> > +// { dg-do compile { target c++23 } } >> > +#include <mdspan> >> > + >> > +#include "../layout_traits.h" >> > +#include <cstdint> >> > + >> > +constexpr size_t dyn = std::dynamic_extent; >> > + >> > +constexpr bool >> > +test_stride_overflow() >> > +{ >> > + auto exts = std::extents<uint8_t, dyn, dyn>(1, 3); >> > + auto n = size_t(1) << 9; >> > + auto m = std::layout_stride::mapping(exts, std::array{n, 1zu}); // { >> dg-error "expansion of" } >> > + (void) m; >> > + return true; >> > +} >> > +static_assert(test_stride_overflow()); // { dg-error "expansion of" } >> > + >> > +constexpr bool >> > +test_stride_negative() >> > +{ >> > + auto exts = std::extents<std::size_t, dyn, dyn>(1, 3); >> > + auto m = std::layout_stride::mapping(exts, std::array{1, -4}); // { >> dg-error "expansion of" } >> > + (void) m; >> > + return true; >> > +} >> > +static_assert(test_stride_negative()); // { dg-error "expansion of" } >> > + >> > +// { dg-prune-output "non-constant condition for static assertion" } >> > +// { dg-prune-output "__glibcxx_assert_fail()" } >> > -- >> > 2.54.0 >> > >> >>
