On Mon, 8 Dec 2025 at 22:17, 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]>
> ---
>
> 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]
This indicates a compiler bug, because it's talking about a variable
which doesn't exist in the source code. So it's something produced by
an optimization that GCC applied, and so it should either optimize
correctly or not complain about it.
The patch is OK for trunk.
>
> 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
>