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