From: Luc Grosheintz Date: Mon, 21 Jul 2025 15:50:31 +0000 (+0200) Subject: libstdc++: Implement std::dims from . X-Git-Tag: basepoints/gcc-17~5482 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=985684e9b35f489166e0dac445414895ce8de0fe;p=thirdparty%2Fgcc.git libstdc++: Implement std::dims from . 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 Signed-off-by: Luc Grosheintz --- diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index dbe2cb8f175..e9830d9d685 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -1007,6 +1007,10 @@ ftms = { ftms = { name = mdspan; + values = { + v = 202406; + cxxmin = 26; + }; values = { v = 202207; cxxmin = 23; diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index 7bb6016df68..59b0cfa1f92 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -1125,7 +1125,12 @@ #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 diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan index 4db4fd98b43..b7b437540f5 100644 --- a/libstdc++-v3/include/std/mdspan +++ b/libstdc++-v3/include/std/mdspan @@ -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 + using dims = dextents<_IndexType, _Rank>; +#endif + template requires (is_convertible_v<_Integrals, size_t> && ...) explicit extents(_Integrals...) -> diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in index 405bb6e7c1c..aa577075362 100644 --- a/libstdc++-v3/src/c++23/std.cc.in +++ b/libstdc++-v3/src/c++23/std.cc.in @@ -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; diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc b/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc index bca8901685d..8a43a682004 100644 --- a/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc +++ b/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc @@ -159,6 +159,13 @@ static_assert(std::extents::static_extent(1) == dyn); static_assert(std::extents::static_extent(0) == dyn); static_assert(std::extents::static_extent(1) == dyn); +// dims +#if __glibcxx_mdspan >= 202406L +static_assert(std::is_same_v, std::dextents>); +static_assert(std::is_same_v, std::dextents>); +static_assert(std::is_same_v, std::dextents>); +#endif + // extent template constexpr void diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/version.cc b/libstdc++-v3/testsuite/23_containers/mdspan/version.cc index 106ee4010ee..752060262a0 100644 --- a/libstdc++-v3/testsuite/23_containers/mdspan/version.cc +++ b/libstdc++-v3/testsuite/23_containers/mdspan/version.cc @@ -1,9 +1,12 @@ -// { dg-do compile { target c++23 } } +// { dg-do preprocess { target c++23 } } +// { dg-add-options no_pch } + #include #ifndef __cpp_lib_mdspan #error "Feature test macro __cpp_lib_mdspan is missing for " -#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