From d21776ef90361e66401cd99c8ff0d98b46d3b0d6 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 12 Nov 2020 13:31:02 +0000 Subject: [PATCH] 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, __numeric_traits) (__numeric_traits): Add explicit specializations. --- libstdc++-v3/include/ext/numeric_traits.h | 33 ++++++++++++++++------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/libstdc++-v3/include/ext/numeric_traits.h b/libstdc++-v3/include/ext/numeric_traits.h index c29f9f21d1a..2cac7f1d1ed 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 const int __numeric_traits_floating<_Value>::__max_exponent10; - template - 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 + struct __numeric_traits + : public __numeric_traits_integer<_Value> + { }; + + template<> + struct __numeric_traits + : public __numeric_traits_floating + { }; + + template<> + struct __numeric_traits + : public __numeric_traits_floating + { }; + + template<> + struct __numeric_traits + : public __numeric_traits_floating + { }; + +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace + #endif