From e46c5b3219436d92b867457c0a4465db29c42cde Mon Sep 17 00:00:00 2001 From: Luc Grosheintz Date: Sat, 24 May 2025 13:26:55 +0200 Subject: [PATCH] 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 --- libstdc++-v3/include/std/mdspan | 2 +- .../mdspan/extents/ctor_default.cc | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc 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; +} -- 2.47.2