On Mon, Dec 8, 2025 at 9:21 PM Luc Grosheintz <[email protected]>
wrote:

> Splitting the tests for submdspan triggered a compiler warning. This
> commit changes the implementation of __dynamic_extents. In particular,
> how the span is created. Functionally, the two are equivalent.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/mdspan (_ExtentsStorage::_M_dynamic_extents):
>         Create span from pointer + size, not begin and end iterators.
>
> Signed-off-by: Luc Grosheintz <[email protected]>
> ---
>
LGTM

>
> Without this change after splitting the test, the instantiation for
> certain layouts, i.e. padded with PaddingSize 8 (both left and right),
> compiles with a warning.
>
> libstdc++-v3/include/mdspan:276: warning: '<unknown>' may be used
> uninitialized [-Wmaybe-uninitialized]
>
> The changes in this commit silence the warning. Debugging the issue is
> made very difficult by the following:
>
> 1. The error messages doesn't list which instantiation causes the
> warning. It simply states: "In header included from this other header,
> the might be an uninitialized value.
>
> 2. Using bisection to narrow down what causes the warning to appear
> leads to: neither half.
>
> 3. Without the addition flags, the tests compile, run and pass.
>
> 4. Neither `-fsanitize=address` nor `-fsanitize=undefined` find
> anything.
>
> 5. The most likely reason would be that we're doing pointer arithmetic
> with null pointers; but I can't see it. I've looked several times and
> __dynamic_extents isn't called when all extents are static and the
> warning messages suggests that the dynamic rank is 3.
>
> Here's the full output:
>
> In file included from
> libstdc++-v3/testsuite/23_containers/mdspan/submdspan/selections/testcases.h:1,
>                  from
> libstdc++-v3/testsuite/23_containers/mdspan/submdspan/selections/left_padded_8.cc:2:
> In member function 'constexpr std::span<const _IndexType>
> std::__mdspan::_ExtentsStorage<_IndexType,
> _Extents>::_M_dynamic_extents(std::size_t, std::size_t) const requires
> _Extents.size() > 0 [with _IndexType = long unsigned int; array<...auto...>
> _Extents = std::array<long unsigned int, 3>{std::__array_traits<long
> unsigned int, 3>::_Type{18446744073709551615, 18446744073709551615,
> 18446744073709551615}}]',
>     inlined from 'constexpr std::span<const typename _Extents::index_type>
> std::__mdspan::__dynamic_extents(const _Extents&, std::size_t, std::size_t)
> [with _Extents = std::extents<long unsigned int, 18446744073709551615,
> 18446744073709551615, 18446744073709551615>]' at
> libstdc++-v3/include/mdspan:344,
>     inlined from 'constexpr bool
> std::__mdspan::__is_representable_extents(const _Extents&) [with _Extents =
> std::extents<long unsigned int, 18446744073709551615, 18446744073709551615,
> 18446744073709551615>]' at libstdc++-v3/include/mdspan:774,
>     inlined from 'constexpr std::__mdspan::_PaddedStorage<_PaddingValue,
> _Extents, _LayoutTraits>::_PaddedStorage(const _Extents&) [with long
> unsigned int _PaddingValue = 8; _Extents = std::extents<long unsigned int,
> 18446744073709551615, 18446744073709551615, 18446744073709551615>;
> _LayoutTraits = std::__mdspan::_LeftPaddedLayoutTraits<3>]' at
> libstdc++-v3/include/mdspan:2271:
> libstdc++-v3/include/mdspan:276: warning: '<unknown>' may be used
> uninitialized [-Wmaybe-uninitialized]
> In file included from libstdc++-v3/include/mdspan:36:
> libstdc++-v3/include/span: In constructor 'constexpr
> std::__mdspan::_PaddedStorage<_PaddingValue, _Extents,
> _LayoutTraits>::_PaddedStorage(const _Extents&) [with long unsigned int
> _PaddingValue = 8; _Extents = std::extents<long unsigned int,
> 18446744073709551615, 18446744073709551615, 18446744073709551615>;
> _LayoutTraits = std::__mdspan::_LeftPaddedLayoutTraits<3>]':
> libstdc++-v3/include/span:194: note: by argument 3 of type 'const long
> unsigned int*' to 'constexpr std::span<_Type, _Extent>::span(_It, _End)
> [with _It = const long unsigned int*; _End = const long unsigned int*;
> _Type = const long unsigned int; long unsigned int _Extent =
> 18446744073709551615]' declared here
>
>
>  libstdc++-v3/include/std/mdspan | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/std/mdspan
> b/libstdc++-v3/include/std/mdspan
> index 03cc4f02a1c..cef658da470 100644
> --- a/libstdc++-v3/include/std/mdspan
> +++ b/libstdc++-v3/include/std/mdspan
> @@ -271,7 +271,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>         requires (_Extents.size() > 0)
>         {
>           return {_M_dyn_exts + _S_dynamic_index(__begin),
> -                 _M_dyn_exts + _S_dynamic_index(__end)};
> +                 _S_dynamic_index(__end) - _S_dynamic_index(__begin)};
>         }
>
>        private:
> --
> 2.52.0
>
>

Reply via email to