aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Grosheintz <luc.grosheintz@gmail.com>2025-05-24 13:26:55 +0200
committerTomasz KamiƄski <tkaminsk@redhat.com>2025-05-27 11:12:25 +0200
commite46c5b3219436d92b867457c0a4465db29c42cde (patch)
treed076fc84e073b2ad1d105c313b03fffc2a5ec888
parent672569cee76a1927d14b5eb754a5ff0b9cee1bc8 (diff)
downloadgcc-e46c5b3219436d92b867457c0a4465db29c42cde.zip
gcc-e46c5b3219436d92b867457c0a4465db29c42cde.tar.gz
gcc-e46c5b3219436d92b867457c0a4465db29c42cde.tar.bz2
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.grosheintz@gmail.com>
-rw-r--r--libstdc++-v3/include/std/mdspan2
-rw-r--r--libstdc++-v3/testsuite/23_containers/mdspan/extents/ctor_default.cc41
2 files changed, 42 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index 47cfa40..bcf2fa6 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 0000000..eec300f
--- /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;
+}