aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-11-12 13:31:02 +0000
committerJonathan Wakely <jwakely@redhat.com>2020-11-12 14:36:39 +0000
commitd21776ef90361e66401cd99c8ff0d98b46d3b0d6 (patch)
treed700ed0add53cfa97723aea1088cba562031a35f
parent896db49a442a15a1fa1f641cd0385da1ba1794e3 (diff)
downloadgcc-d21776ef90361e66401cd99c8ff0d98b46d3b0d6.zip
gcc-d21776ef90361e66401cd99c8ff0d98b46d3b0d6.tar.gz
gcc-d21776ef90361e66401cd99c8ff0d98b46d3b0d6.tar.bz2
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.
-rw-r--r--libstdc++-v3/include/ext/numeric_traits.h29
1 files changed, 21 insertions, 8 deletions
diff --git a/libstdc++-v3/include/ext/numeric_traits.h b/libstdc++-v3/include/ext/numeric_traits.h
index c29f9f2..2cac7f1 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;
+#undef __glibcxx_floating
+#undef __glibcxx_max_digits10
+#undef __glibcxx_digits10
+#undef __glibcxx_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
+ : 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
-#undef __glibcxx_floating
-#undef __glibcxx_max_digits10
-#undef __glibcxx_digits10
-#undef __glibcxx_max_exponent10
-
#endif