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]

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