https://gcc.gnu.org/g:e46c5b3219436d92b867457c0a4465db29c42cde

commit r16-891-ge46c5b3219436d92b867457c0a4465db29c42cde
Author: Luc Grosheintz <luc.groshei...@gmail.com>
Date:   Sat May 24 13:26:55 2025 +0200

    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 <luc.groshei...@gmail.com>

Diff:
---
 libstdc++-v3/include/std/mdspan                    |  2 +-
 .../23_containers/mdspan/extents/ctor_default.cc   | 41 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index 47cfa405e442..bcf2fa60feab 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<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 000000000000..eec300f68962
--- /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;
+}

Reply via email to