On Thu, Jul 17, 2025 at 9:09 AM Luc Grosheintz <luc.groshei...@gmail.com> wrote:
This commit implements the C++26 feature std::dims, sets the feature > testing macro to 202403 and adds tests. > > libstdc++-v3/ChangeLog: > > * include/bits/version.def (mdspan): Set value for C++26. > * include/bits/version.h: Regenerate. > * include/std/mdspan (dims): Add. > * testsuite/23_containers/mdspan/extents/misc.cc: Add tests. > * testsuite/23_containers/mdspan/version.cc: Update test. > The update to the std module is missing. Outside of that this LGTM. > > 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 +++++ > .../testsuite/23_containers/mdspan/extents/misc.cc | 7 +++++++ > libstdc++-v3/testsuite/23_containers/mdspan/version.cc | 6 ++++-- > 5 files changed, 26 insertions(+), 3 deletions(-) > > diff --git a/libstdc++-v3/include/bits/version.def > b/libstdc++-v3/include/bits/version.def > index cf0672b4822..f645bb3ed3b 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 = 202403; > + cxxmin = 26; > + }; > values = { > v = 202207; > cxxmin = 23; > diff --git a/libstdc++-v3/include/bits/version.h > b/libstdc++-v3/include/bits/version.h > index c01ddf14dd5..fbdc9b65acf 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 202403L > +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_mdspan) > +# define __cpp_lib_mdspan 202403L > +# 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 b34116a85e6..ffbd1d9d542 100644 > --- a/libstdc++-v3/include/std/mdspan > +++ b/libstdc++-v3/include/std/mdspan > @@ -412,6 +412,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > using dextents = decltype(__mdspan::__build_dextents_type<_IndexType>( > make_index_sequence<_Rank>())); > > +#if __glibcxx_mdspan >= 202403L > + 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/testsuite/23_containers/mdspan/extents/misc.cc > b/libstdc++-v3/testsuite/23_containers/mdspan/extents/misc.cc > index bca8901685d..933a77aab79 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 >= 202403L > +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..aa3767bd2c5 100644 > --- a/libstdc++-v3/testsuite/23_containers/mdspan/version.cc > +++ b/libstdc++-v3/testsuite/23_containers/mdspan/version.cc > @@ -3,7 +3,9 @@ > > #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" > +#if __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 != 202403L > +#error "Feature test macro __cpp_lib_mdspan has the wrong value for C++26" > #endif > #endif > -- > 2.50.0 > >