[gcc r16-3318] libstdc++: Replace numeric_limit with __int_traits in mdspan.

Tomasz Kaminski tkaminsk@gcc.gnu.org
Thu Aug 21 08:28:12 GMT 2025


https://gcc.gnu.org/g:1a17fd28266ac8cde73a971fc7ebc216f4d07a05

commit r16-3318-g1a17fd28266ac8cde73a971fc7ebc216f4d07a05
Author: Luc Grosheintz <luc.grosheintz@gmail.com>
Date:   Sun Aug 3 22:57:30 2025 +0200

    libstdc++: Replace numeric_limit with __int_traits in mdspan.
    
    Using __int_traits avoids the need to include <limits> from <mdspan>.
    This in turn should reduce the size of the pre-compiled <mdspan>.
    Similar refactoring was carried out for PR92546. Unfortunately,
    
      ./gcc/xgcc -std=c++23 -P -E -x c++ - -include mdspan | wc -l
    
    shows a decrease by 1(!) line. This is due to bits/max_size_type.h which
    includes <limits>.
    
    libstdc++-v3/ChangeLog:
    
            * include/std/mdspan (__valid_static_extent): Replace
            numeric_limits with __int_traits.
            (extents::_S_ctor_explicit): Ditto.
            (extents::__static_quotient): Ditto.
            (layout_stride::mapping::mapping): Ditto.
            (mdspan::size): Ditto.
            * testsuite/23_containers/mdspan/extents/class_mandates_neg.cc:
            Update test with additional diagnostics.
    
    Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
    Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>

Diff:
---
 libstdc++-v3/include/std/mdspan                    | 26 ++++++++++++----------
 .../mdspan/extents/class_mandates_neg.cc           |  3 +++
 2 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index fdec81300d79..351018a59a51 100644
--- a/libstdc++-v3/include/std/mdspan
+++ b/libstdc++-v3/include/std/mdspan
@@ -36,7 +36,6 @@
 #include <span>
 #include <array>
 #include <type_traits>
-#include <limits>
 #include <utility>
 
 #define __glibcxx_want_mdspan
@@ -250,7 +249,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     template<size_t _Extent, typename _IndexType>
       concept
       __valid_static_extent = _Extent == dynamic_extent
-	|| _Extent <= numeric_limits<_IndexType>::max();
+	|| _Extent <= __gnu_cxx::__int_traits<_IndexType>::__max;
 
     template<typename _Extents>
       constexpr const array<size_t, _Extents::rank()>&
@@ -351,8 +350,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	_S_ctor_explicit()
 	{
 	  return (_S_is_less_dynamic(_Extents, _OExtents) || ...)
-	    || (numeric_limits<index_type>::max()
-		< numeric_limits<_OIndexType>::max());
+	    || (__gnu_cxx::__int_traits<index_type>::__max
+		< __gnu_cxx::__int_traits<_OIndexType>::__max);
 	}
 
       template<size_t... _OExtents>
@@ -589,7 +588,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     template<typename _Extents,
              typename _IndexType = typename _Extents::index_type>
       consteval _IndexType
-      __static_quotient(_IndexType __nom = numeric_limits<_IndexType>::max())
+      __static_quotient(_IndexType __nom = __gnu_cxx::__int_traits<_IndexType>
+						    ::__max)
       {
 	std::span<const size_t> __sta_exts = __static_extents<_Extents>();
 	for (auto __factor : __sta_exts)
@@ -1038,12 +1038,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  static_assert(__mdspan::__representable_size<_OExtents, index_type>,
 	    "The size of StridedMapping::extents_type must be representable as"
 	    " index_type");
-	  if constexpr (cmp_greater(numeric_limits<_OIndexType>::max(),
-				    numeric_limits<index_type>::max()))
-	    __glibcxx_assert(!cmp_less(numeric_limits<index_type>::max(),
-				       __other.required_span_size())
-		&& "other.required_span_size() must be representable"
-		   " as index_type");
+	  if constexpr (cmp_greater(__gnu_cxx::__int_traits<_OIndexType>::__max,
+				    __gnu_cxx::__int_traits<index_type>::__max))
+	    __glibcxx_assert(!cmp_less(
+		__gnu_cxx::__int_traits<index_type>::__max,
+		__other.required_span_size())
+	      && "other.required_span_size() must be representable"
+		 " as index_type");
 	  if constexpr (extents_type::rank() > 0)
 	    for (size_t __i = 0; __i < extents_type::rank(); ++__i)
 	      _M_strides[__i] = index_type(__other.stride(__i));
@@ -1360,7 +1361,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       size() const noexcept
       {
 	__glibcxx_assert(cmp_less_equal(_M_mapping.required_span_size(),
-					numeric_limits<size_t>::max()));
+					__gnu_cxx::__int_traits<size_t>
+						 ::__max));
 	return size_type(__mdspan::__size(extents()));
       }
 
diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc b/libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc
index 67d18feda96c..db5cad27e521 100644
--- a/libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/extents/class_mandates_neg.cc
@@ -12,3 +12,6 @@ std::extents<double, 1> e4;               // { dg-error "from here" }
 // { dg-prune-output "signed or unsigned integer" }
 // { dg-prune-output "invalid use of incomplete type" }
 // { dg-prune-output "non-constant condition for static assertion" }
+// { dg-prune-output "integer constants in boolean context" }
+// { dg-prune-output "__gnu_cxx::__numeric_traits_integer" }
+// { dg-prune-output "static assertion failed" }


More information about the Libstdc++-cvs mailing list