https://gcc.gnu.org/g:5756d0b61317b28922e5c7a9ce30f0aca19b901d
commit r16-4091-g5756d0b61317b28922e5c7a9ce30f0aca19b901d Author: Luc Grosheintz <luc.groshei...@gmail.com> Date: Tue Sep 23 15:10:04 2025 +0200 libstdc++: Refactor __mdspan::__static_quotient. For padded layouts we want to check that the product of the padded stride with the remaining extents is representable. Creating a second overload, allows passing in subspans of the static extents and retains the ergonomics for the common case of passing in all static extents. libstdc++-v3/ChangeLog: * include/std/mdspan (__static_quotient): New overload. Reviewed-by: Tomasz KamiĆski <tkami...@redhat.com> Reviewed-by: Jonathan Wakely <jwak...@redhat.com> Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com> Diff: --- libstdc++-v3/include/std/mdspan | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan index 01d3b2cb6b17..d9b5152b6938 100644 --- a/libstdc++-v3/include/std/mdspan +++ b/libstdc++-v3/include/std/mdspan @@ -597,13 +597,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __res; } - template<typename _Extents, - typename _IndexType = typename _Extents::index_type> + template<typename _IndexType> consteval _IndexType - __static_quotient(_IndexType __nom = __gnu_cxx::__int_traits<_IndexType> - ::__max) + __static_quotient(std::span<const size_t> __sta_exts, + _IndexType __nom = __gnu_cxx::__int_traits<_IndexType>::__max) { - std::span<const size_t> __sta_exts = __static_extents<_Extents>(); for (auto __factor : __sta_exts) { if (__factor != dynamic_extent) @@ -614,6 +612,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __nom; } + template<typename _Extents, + typename _IndexType = typename _Extents::index_type> + requires __is_extents<_Extents> + consteval _IndexType + __static_quotient(_IndexType __nom + = __gnu_cxx::__int_traits<_IndexType>::__max) + { + std::span<const size_t> __sta_exts = __static_extents<_Extents>(); + return __static_quotient<_IndexType>(__sta_exts, __nom); + } + template<typename _Extents> constexpr bool __is_representable_extents(const _Extents& __exts) noexcept