]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Implement std::dims from <mdspan>.
authorLuc Grosheintz <luc.grosheintz@gmail.com>
Mon, 21 Jul 2025 15:50:31 +0000 (17:50 +0200)
committerTomasz Kamiński <tkaminsk@redhat.com>
Thu, 21 Aug 2025 08:45:17 +0000 (10:45 +0200)
This commit implements the C++26 feature std::dims described in P2389R2.
It sets the feature testing macro to 202406 and adds tests.

Also fixes the test mdspan/version.cc

libstdc++-v3/ChangeLog:

* include/bits/version.def (mdspan): Set value for C++26.
* include/bits/version.h: Regenerate.
* include/std/mdspan (dims): Add.
* src/c++23/std.cc.in (dims): Add.
* testsuite/23_containers/mdspan/extents/misc.cc: Add tests.
* testsuite/23_containers/mdspan/version.cc: Update test.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
libstdc++-v3/include/bits/version.def
libstdc++-v3/include/bits/version.h
libstdc++-v3/include/std/mdspan
libstdc++-v3/src/c++23/std.cc.in
libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc
libstdc++-v3/testsuite/23_containers/mdspan/version.cc

index dbe2cb8f175b647dbe235666b963102375de8d1b..e9830d9d685db079b151ee4f1b040ad37bdeb935 100644 (file)
@@ -1007,6 +1007,10 @@ ftms = {
 
 ftms = {
   name = mdspan;
+  values = {
+    v = 202406;
+    cxxmin = 26;
+  };
   values = {
     v = 202207;
     cxxmin = 23;
index 7bb6016df687256735e8d2f690bbe3b6d2428c63..59b0cfa1f92f9a6963fd0d9aa48e41df50c42cac 100644 (file)
 #undef __glibcxx_want_span
 
 #if !defined(__cpp_lib_mdspan)
-# if (__cplusplus >= 202100L)
+# if (__cplusplus >  202302L)
+#  define __glibcxx_mdspan 202406L
+#  if defined(__glibcxx_want_all) || defined(__glibcxx_want_mdspan)
+#   define __cpp_lib_mdspan 202406L
+#  endif
+# elif (__cplusplus >= 202100L)
 #  define __glibcxx_mdspan 202207L
 #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_mdspan)
 #   define __cpp_lib_mdspan 202207L
index 4db4fd98b4324d996ed5c246283b1158ec01ce63..b7b437540f58088840f1b2b860059c29fdeae4c8 100644 (file)
@@ -534,6 +534,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     using dextents = decltype(__mdspan::__build_dextents_type<_IndexType>(
        make_index_sequence<_Rank>()));
 
+#if __glibcxx_mdspan >= 202406L
+  template<size_t _Rank, typename _IndexType = size_t>
+    using dims = dextents<_IndexType, _Rank>;
+#endif
+
   template<typename... _Integrals>
     requires (is_convertible_v<_Integrals, size_t> && ...)
     explicit extents(_Integrals...) ->
index 405bb6e7c1ceafcc140794b0c3e33dd0dd82b657..aa577075362edc9f976d288b62cd9265fe61e102 100644 (file)
@@ -1858,6 +1858,9 @@ export namespace std
 {
   using std::extents;
   using std::dextents;
+#if __glibcxx_mdspan >= 202406L
+  using std::dims;
+#endif
   using std::layout_left;
   using std::layout_right;
   using std::layout_stride;
index bca8901685d0fe8d7db32cc81105495278c1491c..8a43a682004d0e9155c8270bccf7751b5f30227c 100644 (file)
@@ -159,6 +159,13 @@ static_assert(std::extents<int, 1, dyn>::static_extent(1) == dyn);
 static_assert(std::extents<int, dyn, dyn>::static_extent(0) == dyn);
 static_assert(std::extents<int, dyn, dyn>::static_extent(1) == dyn);
 
+// dims
+#if __glibcxx_mdspan >= 202406L
+static_assert(std::is_same_v<std::dims<0>, std::dextents<size_t, 0>>);
+static_assert(std::is_same_v<std::dims<3>, std::dextents<size_t, 3>>);
+static_assert(std::is_same_v<std::dims<3, int>, std::dextents<int, 3>>);
+#endif
+
 // extent
 template<typename Extent>
   constexpr void
index 106ee4010ee60dae00f049cfbf97fd36b2c20f11..752060262a0691a23a94b0c76b32a43ee50c55a4 100644 (file)
@@ -1,9 +1,12 @@
-// { dg-do compile { target c++23 } }
+// { dg-do preprocess { target c++23 } }
+// { dg-add-options no_pch }
+
 #include <mdspan>
 
 #ifndef __cpp_lib_mdspan
 #error "Feature test macro __cpp_lib_mdspan is missing for <mdspan>"
-#if __cpp_lib_mdspan < 202207
-#error "Feature test macro __cpp_lib_mdspan has the wrong value"
-#endif
+#elif __cplusplus <= 202302L && __cpp_lib_mdspan != 202207L
+#error "Feature test macro __cpp_lib_mdspan has the wrong value for C++23"
+#elif __cplusplus > 202302L && __cpp_lib_mdspan != 202406L
+#error "Feature test macro __cpp_lib_mdspan has the wrong value for C++26"
 #endif