PR/50646: Use the c99 cabs math builtins directly, because cabs and cabsf
have broken ABI's can cabsl does not exist. The correct(?) probably fix is to change the cabs builtins to point to the c99 variants directly... XXX: pullup-7 and the same file from the gcc.old tree.
This commit is contained in:
parent
e85b730730
commit
3965f5d7b6
@ -44,6 +44,16 @@
|
||||
#include <cmath>
|
||||
#include <sstream>
|
||||
|
||||
#if _GLIBCXX_USE_C99_COMPLEX
|
||||
// This is disgusting; we can't include ccomplex because that c++11
|
||||
// and we can't use the builtins because those point to the wrong
|
||||
// ABI-wise cabs/cabsf so we manually declare those here and use
|
||||
// them directly.
|
||||
extern "C" float __c99_cabsf(_Complex float);
|
||||
extern "C" double __c99_cabs(_Complex double);
|
||||
extern "C" long double __c99_cabsl(_Complex long double);
|
||||
#endif
|
||||
|
||||
// Get rid of a macro possibly defined in <complex.h>
|
||||
#undef complex
|
||||
|
||||
@ -580,15 +590,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
}
|
||||
|
||||
#if _GLIBCXX_USE_C99_COMPLEX
|
||||
// XXX: We can't use __builtin_cabs* because they are broken
|
||||
inline float
|
||||
__complex_abs(__complex__ float __z) { return __builtin_cabsf(__z); }
|
||||
__complex_abs(__complex__ float __z) { return __c99_cabsf(__z); }
|
||||
|
||||
inline double
|
||||
__complex_abs(__complex__ double __z) { return __builtin_cabs(__z); }
|
||||
__complex_abs(__complex__ double __z) { return __c99_cabs(__z); }
|
||||
|
||||
inline long double
|
||||
__complex_abs(const __complex__ long double& __z)
|
||||
{ return __builtin_cabsl(__z); }
|
||||
{ return __c99_cabsl(__z); }
|
||||
|
||||
template<typename _Tp>
|
||||
inline _Tp
|
||||
|
Loading…
Reference in New Issue
Block a user