aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/std/complex
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/include/std/complex')
-rw-r--r--libstdc++-v3/include/std/complex348
1 files changed, 301 insertions, 47 deletions
diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
index 3f883504290..d2aa172fc95 100644
--- a/libstdc++-v3/include/std/complex
+++ b/libstdc++-v3/include/std/complex
@@ -41,10 +41,13 @@
#include <bits/c++config.h>
#include <bits/cpp_type_traits.h>
#include <ext/type_traits.h>
-#define _GLIBCXX_NO_SPECFUN
+#define _GLIBCXX_NO_SPECFUN 1
# include <cmath>
#undef _GLIBCXX_NO_SPECFUN
#include <sstream>
+#if _GLIBCXX_HAVE_FLOAT128_MATH
+#include <bits/float128_io.h>
+#endif
// Get rid of a macro possibly defined in <complex.h>
#undef complex
@@ -568,6 +571,42 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return __z.imag(); }
#endif
+#if _GLIBCXX_HAVE_FLOAT128_MATH
+ typedef _Complex float __attribute__((mode(TC))) __complex128;
+#ifdef __cplusplus
+extern "C" {
+#endif
+ __float128 strtoflt128 (const char*, char**) _GLIBCXX_NOEXCEPT;
+
+ __float128 cabsq (__complex128) _GLIBCXX_NOEXCEPT;
+ __float128 cargq (__complex128) _GLIBCXX_NOEXCEPT;
+ __float128 cimagq (__complex128) _GLIBCXX_NOEXCEPT;
+ __float128 crealq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 cacosq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 cacoshq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 casinq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 casinhq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 catanq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 catanhq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 ccosq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 ccoshq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 cexpq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 cexpiq (__float128) _GLIBCXX_NOEXCEPT;
+ __complex128 clogq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 clog10q (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 conjq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 cpowq (__complex128, __complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 cprojq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 csinq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 csinhq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 csqrtq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 ctanq (__complex128) _GLIBCXX_NOEXCEPT;
+ __complex128 ctanhq (__complex128) _GLIBCXX_NOEXCEPT;
+#ifdef __cplusplus
+}
+#endif
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
+
// 26.2.7/3 abs(__z): Returns the magnitude of __z.
template<typename _Tp>
inline _Tp
@@ -594,11 +633,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_abs(const __complex__ long double& __z)
{ return __builtin_cabsl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __float128
__complex_abs(const __complex128& __z)
{ return cabsq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline _Tp
@@ -627,11 +666,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_arg(const __complex__ long double& __z)
{ return __builtin_cargl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __float128
__complex_arg(const __complex128& __z)
{ return cargq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline _Tp
@@ -714,11 +753,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_cos(const __complex__ long double& __z)
{ return __builtin_ccosl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_cos(const __complex128& __z)
{ return ccosq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -750,11 +789,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_cosh(const __complex__ long double& __z)
{ return __builtin_ccoshl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_cosh(const __complex128& __z)
{ return ccoshq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -782,11 +821,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_exp(const __complex__ long double& __z)
{ return __builtin_cexpl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_exp(const __complex128& __z)
{ return cexpq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -815,11 +854,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_log(const __complex__ long double& __z)
{ return __builtin_clogl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_log(const __complex128& __z)
{ return clogq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -856,11 +895,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_sin(const __complex__ long double& __z)
{ return __builtin_csinl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_sin(const __complex128& __z)
{ return csinq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -892,11 +931,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_sinh(const __complex__ long double& __z)
{ return __builtin_csinhl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_sinh(const __complex128& __z)
{ return csinhq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -942,11 +981,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_sqrt(const __complex__ long double& __z)
{ return __builtin_csqrtl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_sqrt(const __complex128& __z)
{ return csqrtq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -975,11 +1014,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_tan(const __complex__ long double& __z)
{ return __builtin_ctanl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_tan(const __complex128& __z)
{ return ctanq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -1009,11 +1048,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_tanh(const __complex__ long double& __z)
{ return __builtin_ctanhl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_tanh(const __complex128& __z)
{ return ctanhq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -1093,11 +1132,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
const __complex__ long double& __y)
{ return __builtin_cpowl(__x, __y); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_pow(const __complex128& __x, const __complex128& __y)
{ return cpowq(__x, __y); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline complex<_Tp>
@@ -1141,9 +1180,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
explicit _GLIBCXX_CONSTEXPR complex(const complex<double>&);
explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
explicit _GLIBCXX_CONSTEXPR complex(const complex<__float128>&);
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
@@ -1295,9 +1334,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
: _M_value(__z.__rep()) { }
explicit _GLIBCXX_CONSTEXPR complex(const complex<long double>&);
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
explicit _GLIBCXX_CONSTEXPR complex(const complex<__float128>&);
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
@@ -1451,9 +1490,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_CONSTEXPR complex(const complex<double>& __z)
: _M_value(__z.__rep()) { }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
explicit _GLIBCXX_CONSTEXPR complex(const complex<__float128>&);
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
@@ -1580,6 +1619,189 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_ComplexT _M_value;
};
+#if _GLIBCXX_HAVE_FLOAT128_MATH
+
+ /// complex<__float128> specialization
+ template<>
+ struct complex<__float128>
+ {
+ typedef __float128 value_type;
+
+ // From quadmath.h
+ //typedef _Complex float __attribute__((mode(TC))) __complex128;
+ typedef __complex128 _ComplexT;
+
+ _GLIBCXX_CONSTEXPR
+ complex(_ComplexT __z)
+ : _M_value(__z)
+ { }
+
+ _GLIBCXX_CONSTEXPR
+ complex(__float128 __r = 0.0Q,
+ __float128 __i = 0.0Q)
+#if __cplusplus >= 201103L
+ : _M_value{ __r, __i }
+ { }
+#else
+ {
+ __real__ _M_value = __r;
+ __imag__ _M_value = __i;
+ }
+#endif
+
+ _GLIBCXX_CONSTEXPR
+ complex(const complex<float>& __z)
+ : _M_value(__z.__rep())
+ { }
+
+ _GLIBCXX_CONSTEXPR
+ complex(const complex<double>& __z)
+ : _M_value(__z.__rep())
+ { }
+
+ _GLIBCXX_CONSTEXPR
+ complex(const complex<long double>& __z)
+ : _M_value(__z.__rep())
+ { }
+
+#if __cplusplus >= 201103L
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // DR 387. std::complex over-encapsulated.
+ __attribute ((__abi_tag__ ("cxx11")))
+ constexpr __float128
+ real() const
+ { return __real__ _M_value; }
+
+ __attribute ((__abi_tag__ ("cxx11")))
+ constexpr __float128
+ imag() const
+ { return __imag__ _M_value; }
+#else
+ __float128&
+ real()
+ { return __real__ _M_value; }
+
+ const __float128&
+ real() const
+ { return __real__ _M_value; }
+
+ __float128&
+ imag()
+ { return __imag__ _M_value; }
+
+ const __float128&
+ imag()
+ const { return __imag__ _M_value; }
+#endif
+
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // DR 387. std::complex over-encapsulated.
+ void
+ real(__float128 __val)
+ { __real__ _M_value = __val; }
+
+ void
+ imag(__float128 __val)
+ { __imag__ _M_value = __val; }
+
+ complex&
+ operator=(__float128 __r)
+ {
+ _M_value = __r;
+ return *this;
+ }
+
+ complex&
+ operator+=(__float128 __r)
+ {
+ _M_value += __r;
+ return *this;
+ }
+
+ complex&
+ operator-=(__float128 __r)
+ {
+ _M_value -= __r;
+ return *this;
+ }
+
+ complex&
+ operator*=(__float128 __r)
+ {
+ _M_value *= __r;
+ return *this;
+ }
+
+ complex&
+ operator/=(__float128 __r)
+ {
+ _M_value /= __r;
+ return *this;
+ }
+
+ // The compiler knows how to do this efficiently
+ // complex& operator=(const complex&);
+
+ template<typename _Tp>
+ complex&
+ operator=(const complex<_Tp>& __z)
+ {
+ __real__ _M_value = __z.real();
+ __imag__ _M_value = __z.imag();
+ return *this;
+ }
+
+ template<typename _Tp>
+ complex&
+ operator+=(const complex<_Tp>& __z)
+ {
+ __real__ _M_value += __z.real();
+ __imag__ _M_value += __z.imag();
+ return *this;
+ }
+
+ template<typename _Tp>
+ complex&
+ operator-=(const complex<_Tp>& __z)
+ {
+ __real__ _M_value -= __z.real();
+ __imag__ _M_value -= __z.imag();
+ return *this;
+ }
+
+ template<typename _Tp>
+ complex&
+ operator*=(const complex<_Tp>& __z)
+ {
+ _ComplexT __t;
+ __real__ __t = __z.real();
+ __imag__ __t = __z.imag();
+ _M_value *= __t;
+ return *this;
+ }
+
+ template<typename _Tp>
+ complex&
+ operator/=(const complex<_Tp>& __z)
+ {
+ _ComplexT __t;
+ __real__ __t = __z.real();
+ __imag__ __t = __z.imag();
+ _M_value /= __t;
+ return *this;
+ }
+
+ _GLIBCXX_CONSTEXPR _ComplexT
+ __rep() const
+ { return _M_value; }
+
+ private:
+
+ _ComplexT _M_value;
+ };
+
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
+
// These bits have to be at the end of this file, so that the
// specializations have all been defined.
inline _GLIBCXX_CONSTEXPR
@@ -1594,6 +1816,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
complex<double>::complex(const complex<long double>& __z)
: _M_value(__z.__rep()) { }
+#if _GLIBCXX_HAVE_FLOAT128_MATH
+ inline _GLIBCXX_CONSTEXPR
+ complex<float>::complex(const complex<__float128>& __z)
+ : _M_value(__z.__rep()) { }
+
+ inline _GLIBCXX_CONSTEXPR
+ complex<double>::complex(const complex<__float128>& __z)
+ : _M_value(__z.__rep()) { }
+
+ inline _GLIBCXX_CONSTEXPR
+ complex<long double>::complex(const complex<__float128>& __z)
+ : _M_value(__z.__rep()) { }
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
+
// Inhibit implicit instantiations for required instantiations,
// which are defined via explicit instantiations elsewhere.
// NB: This syntax is a GNU extension.
@@ -1604,6 +1840,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
extern template ostream& operator<<(ostream&, const complex<double>&);
extern template istream& operator>>(istream&, complex<long double>&);
extern template ostream& operator<<(ostream&, const complex<long double>&);
+#if _GLIBCXX_HAVE_FLOAT128_MATH
+ template istream& operator>>(istream&, complex<__float128>&);
+ template ostream& operator<<(ostream&, const complex<__float128>&);
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
#ifdef _GLIBCXX_USE_WCHAR_T
extern template wistream& operator>>(wistream&, complex<float>&);
@@ -1612,8 +1852,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
extern template wostream& operator<<(wostream&, const complex<double>&);
extern template wistream& operator>>(wistream&, complex<long double>&);
extern template wostream& operator<<(wostream&, const complex<long double>&);
-#endif
-#endif
+#endif // _GLIBCXX_USE_WCHAR_T
+#endif // _GLIBCXX_EXTERN_TEMPLATE
// @} group complex_numbers
@@ -1688,11 +1928,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_acos(const __complex__ long double& __z)
{ return __builtin_cacosl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_acos(const __complex128& __z)
{ return cacosq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline std::complex<_Tp>
@@ -1730,11 +1970,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_asin(const __complex__ long double& __z)
{ return __builtin_casinl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_asin(const __complex128& __z)
{ return casinq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline std::complex<_Tp>
@@ -1780,11 +2020,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_atan(const __complex__ long double& __z)
{ return __builtin_catanl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_atan(const __complex128& __z)
{ return catanq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline std::complex<_Tp>
@@ -1822,11 +2062,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_acosh(const __complex__ long double& __z)
{ return __builtin_cacoshl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_acosh(const __complex128& __z)
{ return cacoshq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline std::complex<_Tp>
@@ -1867,11 +2107,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_asinh(const __complex__ long double& __z)
{ return __builtin_casinhl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_asinh(const __complex128& __z)
{ return casinhq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline std::complex<_Tp>
@@ -1917,11 +2157,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_atanh(const __complex__ long double& __z)
{ return __builtin_catanhl(__z); }
-#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
+#if _GLIBCXX_HAVE_FLOAT128_MATH
inline __complex128
__complex_atanh(const __complex128& __z)
{ return catanhq(__z); }
-#endif // __STRICT_ANSI__ && _GLIBCXX_USE_FLOAT128
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
template<typename _Tp>
inline std::complex<_Tp>
@@ -2030,6 +2270,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__complex_proj(const __complex__ long double& __z)
{ return __builtin_cprojl(__z); }
+#if _GLIBCXX_HAVE_FLOAT128_MATH
+ inline __complex128
+ __complex_proj(const __complex128& __z)
+ { return cprojq(__z); }
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
+
template<typename _Tp>
inline std::complex<_Tp>
proj(const std::complex<_Tp>& __z)
@@ -2091,6 +2337,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
operator""il(unsigned long long __num)
{ return std::complex<long double>{0.0L, static_cast<long double>(__num)}; }
+#if _GLIBCXX_HAVE_FLOAT128_MATH
+ inline std::complex<__float128>
+ operator""iq(const char* __str)
+ { return complex<__float128>(0.0Q, strtoflt128(__str, 0)); }
+
+ constexpr std::complex<__float128>
+ operator""iq(unsigned long long __num)
+ { return std::complex<__float128>{0.0L, static_cast<__float128>(__num)}; }
+#endif // _GLIBCXX_HAVE_FLOAT128_MATH
+
_GLIBCXX_END_NAMESPACE_VERSION
} // inline namespace complex_literals
} // inline namespace literals
@@ -2101,6 +2357,4 @@ _GLIBCXX_END_NAMESPACE_VERSION
#endif // C++11
-#include <bits/complex128.h>
-
#endif /* _GLIBCXX_COMPLEX */