[PATCH v1] libstdc++: Implement std::dims.

Luc Grosheintz luc.grosheintz@gmail.com
Thu Jul 17 07:31:56 GMT 2025



On 7/17/25 09:07, Luc Grosheintz 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.
> 
> Signed-off-by: Luc Grosheintz <luc.grosheintz@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"

I think this test is and was ineffective, because it would first check
if __cpp_lib_mdspan is defined. If it wasn't defined it would error out. Then,
in the same branch it would pointlessly check if the undefined __cpp_lib_mdspan
had a particular value.

>   #endif
>   #endif



More information about the Libstdc++ mailing list