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 > >
