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. > 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 > >