Here's a small tweak to __numeric_traits that I decided to do after
the previous patch.

Tested on powerpc64le-linux. Committed to trunk.

commit d21776ef90361e66401cd99c8ff0d98b46d3b0d6
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Thu Nov 12 13:31:02 2020

    libstdc++: Simplify __numeric_traits definition
    
    This changes the __numeric_traits primary template to assume its
    argument is an integer type. For the three floating point types that are
    supported by __numeric_traits_floating an explicit specialization of
    __numeric_traits chooses the right base class.
    
    This improves the failure mode for using __numeric_traits with an
    unsupported type. Previously it would use __numeric_traits_floating as
    the base class, and give somewhat obscure errors for trying to access
    the static data members. Now it will use __numeric_traits_integer which
    has a static_assert to check for supported types.
    
    As a side effect of this change there is no need to instantiate
    __conditional_type to decide which base class to use.
    
    libstdc++-v3/ChangeLog:
    
            * include/ext/numeric_traits.h (__numeric_traits): Change
            primary template to always derive from __numeric_traits_integer.
            (__numeric_traits<float>, __numeric_traits<double>)
            (__numeric_traits<long double>): Add explicit specializations.

diff --git a/libstdc++-v3/include/ext/numeric_traits.h b/libstdc++-v3/include/ext/numeric_traits.h
index c29f9f21d1aa..2cac7f1d1edc 100644
--- a/libstdc++-v3/include/ext/numeric_traits.h
+++ b/libstdc++-v3/include/ext/numeric_traits.h
@@ -176,19 +176,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _Value>
     const int __numeric_traits_floating<_Value>::__max_exponent10;
 
-  template<typename _Value>
-    struct __numeric_traits
-    : public __conditional_type<__is_integer_nonstrict<_Value>::__value,
-				__numeric_traits_integer<_Value>,
-				__numeric_traits_floating<_Value> >::__type
-    { };
-
-_GLIBCXX_END_NAMESPACE_VERSION
-} // namespace
-
 #undef __glibcxx_floating
 #undef __glibcxx_max_digits10
 #undef __glibcxx_digits10
 #undef __glibcxx_max_exponent10
 
+  template<typename _Value>
+    struct __numeric_traits
+    : public __numeric_traits_integer<_Value>
+    { };
+
+  template<>
+    struct __numeric_traits<float>
+    : public __numeric_traits_floating<float>
+    { };
+
+  template<>
+    struct __numeric_traits<double>
+    : public __numeric_traits_floating<double>
+    { };
+
+  template<>
+    struct __numeric_traits<long double>
+    : public __numeric_traits_floating<long double>
+    { };
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
+
 #endif

Reply via email to