On Mon, 26 May 2025 at 08:49, Tomasz Kaminski <tkami...@redhat.com> wrote: > > > > On Sat, May 24, 2025 at 1:29 PM Luc Grosheintz <luc.groshei...@gmail.com> > wrote: >> >> 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 <luc.groshei...@gmail.com> >> --- > > LGTM, thanks for noticing and fixing it. > We also need approval from the maintainer.
OK for trunk. >> >> 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{}; > > We know that these are integral types, so we can use {}. >> >> }; >> >> template<typename _OIndexType, typename _SIndexType> >> 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 <mdspan> >> + >> +#include <cstdint> >> +#include <testsuite_hooks.h> >> + >> +constexpr auto dyn = std::dynamic_extent; >> + >> +template<typename Extents> >> + 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<std::extents<int, 1>>(); >> + test_default_ctor<std::extents<int, dyn>>(); >> + test_default_ctor<std::extents<int, 1, 2>>(); >> + test_default_ctor<std::extents<int, dyn, 2>>(); >> + test_default_ctor<std::extents<int, dyn, dyn>>(); >> + test_default_ctor<std::extents<int, 1, 2, 3>>(); >> + test_default_ctor<std::extents<int, dyn, 2, dyn>>(); >> + test_default_ctor<std::extents<int, dyn, dyn, dyn>>(); >> + return true; >> +} >> + >> +int >> +main() >> +{ >> + test_default_ctor_all(); >> + static_assert(test_default_ctor_all()); >> + return 0; >> +} >> -- >> 2.49.0 >>