This commit implements the C++26 feature std::dims described in P2389R2. It sets the feature testing macro to 202406 and adds tests.
Also adds dextents to the module, and 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. (dextents): Add. * testsuite/23_containers/mdspan/extents/misc.cc: Add tests. * testsuite/23_containers/mdspan/version.cc: Update test. Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com> --- libstdc++-v3/include/bits/version.def | 4 ++++ libstdc++-v3/include/bits/version.h | 7 ++++++- libstdc++-v3/include/std/mdspan | 5 +++++ libstdc++-v3/src/c++23/std.cc.in | 4 ++++ .../testsuite/23_containers/mdspan/extents/misc.cc | 7 +++++++ .../testsuite/23_containers/mdspan/version.cc | 11 +++++++---- 6 files changed, 33 insertions(+), 5 deletions(-) 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 271fdb5d8c7..9afb9304fb5 100644 --- a/libstdc++-v3/include/std/mdspan +++ b/libstdc++-v3/include/std/mdspan @@ -414,6 +414,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...) -> diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in index 1bd4bd58f21..569b6aae9a1 100644 --- a/libstdc++-v3/src/c++23/std.cc.in +++ b/libstdc++-v3/src/c++23/std.cc.in @@ -1850,6 +1850,10 @@ export namespace std 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<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 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 <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 -- 2.50.0