From: Luc Grosheintz Date: Sat, 24 May 2025 11:26:55 +0000 (+0200) Subject: libstdc++: Fix bug in default ctor of extents. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e46c5b3219436d92b867457c0a4465db29c42cde;p=thirdparty%2Fgcc.git libstdc++: Fix bug in default ctor of extents. The array that stores the dynamic extents used to be default initialized. The standard requires value intialization. This commit fixes the bug and adds a test. libstdc++-v3/ChangeLog: * include/std/mdspan: Value initialize the array storing the dynamic extents. * testsuite/23_containers/mdspan/extents/ctor_default.cc: New test. Signed-off-by: Luc Grosheintz --- diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan index 47cfa405e44..bcf2fa60fea 100644 --- a/libstdc++-v3/include/std/mdspan +++ b/libstdc++-v3/include/std/mdspan @@ -146,7 +146,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION private: using _S_storage = __array_traits<_IndexType, _S_rank_dynamic>::_Type; - [[no_unique_address]] _S_storage _M_dynamic_extents; + [[no_unique_address]] _S_storage _M_dynamic_extents{}; }; template diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc b/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc new file mode 100644 index 00000000000..eec300f6896 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc @@ -0,0 +1,41 @@ +// { dg-do run { target c++23 } } +#include + +#include +#include + +constexpr auto dyn = std::dynamic_extent; + +template + constexpr void + test_default_ctor() + { + Extents exts; + for(size_t i = 0; i < Extents::rank(); ++i) + if(exts.static_extent(i) == std::dynamic_extent) + VERIFY(exts.extent(i) == 0); + else + VERIFY(exts.extent(i) == Extents::static_extent(i)); + } + +constexpr bool +test_default_ctor_all() +{ + test_default_ctor>(); + test_default_ctor>(); + test_default_ctor>(); + test_default_ctor>(); + test_default_ctor>(); + test_default_ctor>(); + test_default_ctor>(); + test_default_ctor>(); + return true; +} + +int +main() +{ + test_default_ctor_all(); + static_assert(test_default_ctor_all()); + return 0; +}