diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-08-17 20:26:52 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-08-18 14:26:39 +0100 |
commit | 37620d575111caf3b24d4b9039808334e619c13a (patch) | |
tree | 561e86570280c341e4fcfbed90d7b8f6724d640f | |
parent | de44eee5d52f5980b6b2b2120940f70cc2fa007e (diff) | |
download | gcc-37620d575111caf3b24d4b9039808334e619c13a.zip gcc-37620d575111caf3b24d4b9039808334e619c13a.tar.gz gcc-37620d575111caf3b24d4b9039808334e619c13a.tar.bz2 |
libstdc++: Simplify n-ary arithmetic promotion traits
The std::complex partial specializations have been unnecessary since
774c3d8647cc7012937cfc9d2d6dacc85b6cf8e9
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/ext/type_traits.h (__promote_2, __promote_3)
(__promote_4): Redfine as alias templates using __promoted_t.
* include/std/complex (__promote_2): Remove partial
specializations for std::complex.
-rw-r--r-- | libstdc++-v3/include/ext/type_traits.h | 16 | ||||
-rw-r--r-- | libstdc++-v3/include/std/complex | 29 |
2 files changed, 15 insertions, 30 deletions
diff --git a/libstdc++-v3/include/ext/type_traits.h b/libstdc++-v3/include/ext/type_traits.h index 065edb4..fed78d3 100644 --- a/libstdc++-v3/include/ext/type_traits.h +++ b/libstdc++-v3/include/ext/type_traits.h @@ -189,9 +189,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { typedef float __type; }; #if __cpp_fold_expressions + template<typename... _Tp> using __promoted_t = decltype((typename __promote<_Tp>::__type(0) + ...)); -#endif + + // Deducing the promoted type is done by __promoted_t<_Tp...>, + // then __promote is used to provide the nested __type member. + template<typename _Tp, typename _Up> + using __promote_2 = __promote<__promoted_t<_Tp, _Up>>; + + template<typename _Tp, typename _Up, typename _Vp> + using __promote_3 = __promote<__promoted_t<_Tp, _Up, _Vp>>; + + template<typename _Tp, typename _Up, typename _Vp, typename _Wp> + using __promote_4 = __promote<__promoted_t<_Tp, _Up, _Vp, _Wp>>; + +#else template<typename _Tp, typename _Up, typename _Tp2 = typename __promote<_Tp>::__type, @@ -219,6 +232,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { typedef __typeof__(_Tp2() + _Up2() + _Vp2() + _Wp2()) __type; }; +#endif _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index c2f6421..a5b4406 100644 --- a/libstdc++-v3/include/std/complex +++ b/libstdc++-v3/include/std/complex @@ -1557,35 +1557,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace -namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - - // See ext/type_traits.h for the primary template. - template<typename _Tp, typename _Up> - struct __promote_2<std::complex<_Tp>, _Up> - { - public: - typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type; - }; - - template<typename _Tp, typename _Up> - struct __promote_2<_Tp, std::complex<_Up> > - { - public: - typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type; - }; - - template<typename _Tp, typename _Up> - struct __promote_2<std::complex<_Tp>, std::complex<_Up> > - { - public: - typedef std::complex<typename __promote_2<_Tp, _Up>::__type> __type; - }; - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace - #if __cplusplus >= 201103L namespace std _GLIBCXX_VISIBILITY(default) |