diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-10-20 21:18:11 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-10-20 21:18:11 +0000 |
commit | 48244d09317581396dc0c22bdb69489dc0ea4c5a (patch) | |
tree | 264b5c6adf13451da3abce523a64e459d3535ace /math/tgmath.h | |
parent | 10411f2d14f7a567c0a38811e111751d33a4b3e8 (diff) | |
download | glibc-48244d09317581396dc0c22bdb69489dc0ea4c5a.tar.gz |
Update.
* math/tgmath.h: Make nested function calls work.
Diffstat (limited to 'math/tgmath.h')
-rw-r--r-- | math/tgmath.h | 176 |
1 files changed, 111 insertions, 65 deletions
diff --git a/math/tgmath.h b/math/tgmath.h index 76513f7ea8..d15a75d8d3 100644 --- a/math/tgmath.h +++ b/math/tgmath.h @@ -40,87 +40,133 @@ only defined on real valued parameters and those which are defined for complex functions as well. */ # define __TGMATH_UNARY_REAL_ONLY(Val, Fct) \ - (__extension__ (sizeof (Val) == sizeof (double) \ - ? Fct (Val) \ - : (sizeof (Val) == sizeof (long double) \ - ? Fct##l (Val) \ - : Fct##f (Val)))) + (__extension__ ({ __typeof__ (Val) __tgmres; \ + if (sizeof (Val) == sizeof (double)) \ + __tgmres = Fct (Val); \ + else if (sizeof (Val) == sizeof (float)) \ + __tgmres = Fct##f (Val); \ + else \ + __tgmres = Fct##l (Val); \ + __tgmres; })) # define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \ - (__extension__ (sizeof (Val1) > sizeof (double) \ - ? Fct##l (Val1, Val2) \ - : (sizeof (Val1) == sizeof (double) \ - ? Fct (Val1, Val2) \ - : Fct##f (Val1, Val2)))) + (__extension__ ({ __typeof__ (Val1) __tgmres; \ + if (sizeof (Val1) == sizeof (double)) \ + __tgmres = Fct (Val1, Val2); \ + else if (sizeof (Val1) == sizeof (float)) \ + __tgmres = Fct##f (Val1, Val2); \ + else \ + __tgmres = Fct##l (Val1, Val2); \ + __tgmres; })) # define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \ - (__extension__ (sizeof (Val1) > sizeof (double) \ - || sizeof (Val2) > sizeof (double) \ - ? Fct##l (Val1, Val2) \ - : (sizeof (Val1) == sizeof (double) \ - || sizeof (Val2) == sizeof (double) \ - ? Fct (Val1, Val2) \ - : Fct##f (Val1, Val2)))) + (__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \ + if (sizeof (Val1) > sizeof (double) \ + || sizeof (Val2) > sizeof (double)) \ + __tgmres = Fct##l (Val1, Val2); \ + else if (sizeof (Val1) == sizeof (double) \ + || sizeof (Val2) == sizeof (double)) \ + __tgmres = Fct (Val1, Val2); \ + else \ + __tgmres = Fct (Val1, Val2); \ + __tgmres; })) # define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \ - (__extension__ (sizeof (Val1) > sizeof (double) \ - || sizeof (Val2) > sizeof (double) \ - ? Fct##l (Val1, Val2, Val3) \ - : (sizeof (Val1) == sizeof (double) \ - || sizeof (Val2) == sizeof (double) \ - ? Fct (Val1, Val2, Val3) \ - : Fct##f (Val1, Val2, Val3)))) + (__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \ + if (sizeof (Val1) > sizeof (double) \ + || sizeof (Val2) > sizeof (double)) \ + __tgmres = Fct##l (Val1, Val2, Val3); \ + else if (sizeof (Val1) == sizeof (double) \ + || sizeof (Val2) == sizeof (double)) \ + __tgmres = Fct (Val1, Val2, Val3); \ + else \ + __tgmres = Fct (Val1, Val2, Val3); \ + __tgmres; })) # define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \ - (__extension__ (sizeof (Val1) > sizeof (double) \ - || sizeof (Val2) > sizeof (double) \ - || sizeof (Val3) > sizeof (double) \ - ? Fct##l (Val1, Val2, Val3) \ - : (sizeof (Val1) == sizeof (double) \ - || sizeof (Val2) == sizeof (double) \ - || sizeof (Val3) == sizeof (double) \ - ? Fct (Val1, Val2, Val3) \ - : Fct##f (Val1, Val2, Val3)))) + (__extension__ ({ __typeof__ ((Val1) + (Val2) + (Val3)) __tgmres; \ + if (sizeof (Val1) > sizeof (double) \ + || sizeof (Val2) > sizeof (double) \ + || sizeof (Val3) > sizeof (double)) \ + __tgmres = Fct##l (Val1, Val2, Val3); \ + else if (sizeof (Val1) == sizeof (double) \ + || sizeof (Val2) == sizeof (double) \ + || sizeof (Val3) == sizeof (double)) \ + __tgmres = Fct (Val1, Val2, Val3); \ + else \ + __tgmres = Fct (Val1, Val2, Val3); \ + __tgmres; })) +/* XXX This definition has to be changed as soon as the compiler understands + the imaginary keyword. */ # define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \ - (__extension__ (sizeof (__real__ (Val)) > sizeof (double) \ - ? (sizeof (__real__ (Val)) == sizeof (Val) \ - ? Fct##l (Val) \ - : Cfct##l (Val)) \ - : (sizeof (__real__ (Val)) == sizeof (double) \ - ? (sizeof (__real__ (Val)) == sizeof (Val) \ - ? Fct (Val) \ - : Cfct (Val)) \ - : (sizeof (__real__ (Val)) == sizeof (Val) \ - ? Fct##f (Val) \ - : Cfct##f (Val))))) + (__extension__ ({ __typeof__ (Val) __tgmres; \ + if (sizeof (__real__ (Val)) > sizeof (double)) \ + { \ + if (sizeof (__real__ (Val)) == sizeof (Val)) \ + __tgmres = Fct##l (Val); \ + else \ + __tgmres = Cfct##l (Val); \ + } \ + else if (sizeof (__real__ (Val)) == sizeof (double)) \ + { \ + if (sizeof (__real__ (Val)) == sizeof (Val)) \ + __tgmres = Fct (Val); \ + else \ + __tgmres = Cfct (Val); \ + } \ + else \ + { \ + if (sizeof (__real__ (Val)) == sizeof (Val)) \ + __tgmres = Fct##f (Val); \ + else \ + __tgmres = Cfct##f (Val); \ + } \ + __tgmres; })) /* XXX This definition has to be changed as soon as the compiler understands the imaginary keyword. */ # define __TGMATH_UNARY_IMAG_ONLY(Val, Fct) \ - (__extension__ (sizeof (Val) > sizeof (__complex__ double) \ - ? Fct##l (Val) \ - : (sizeof (Val) == sizeof (__complex__ double) \ - ? Fct (Val) \ - : Fct##f (Val)))) + (__extension__ ({ __typeof__ (Val) __tgmres; \ + if (sizeof (Val) == sizeof (__complex__ double)) \ + __tgmres = Fct (Val); \ + else if (sizeof (Val) == sizeof (__complex__ float)) \ + __tgmres = Fct##f (Val); \ + else \ + __tgmres = Fct##l (Val); \ + __tgmres; })) +/* XXX This definition has to be changed as soon as the compiler understands + the imaginary keyword. */ # define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \ - (__extension__ (sizeof (__real__ (Val1)) > sizeof (double) \ - || sizeof (__real__ (Val2)) > sizeof (double) \ - ? (sizeof (__real__ (Val1)) == sizeof (Val1) \ - && sizeof (__real__ (Val2)) == sizeof (Val2) \ - ? Fct##l (Val1, Val2) \ - : Cfct##l (Val1, Val2)) \ - : (sizeof (__real__ (Val1)) == sizeof (double) \ - || sizeof (__real__ (Val2)) == sizeof (double) \ - ? (sizeof (__real__ (Val1)) == sizeof (Val1) \ - && sizeof (__real__ (Val2)) == sizeof (Val2) \ - ? Fct (Val1, Val2) \ - : Cfct (Val1, Val2)) \ - : (sizeof (__real__ (Val1)) == sizeof (Val1) \ - && sizeof (__real__ (Val2)) == sizeof (Val2) \ - ? Fct##f (Val1, Val2) \ - : Cfct##f (Val1, Val2))))) + (__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \ + if (sizeof (__real__ (Val1)) > sizeof (double) \ + || sizeof (__real__ (Val2)) > sizeof (double)) \ + { \ + if (sizeof (__real__ (Val1)) == sizeof (Val1) \ + && sizeof (__real__ (Val2)) == sizeof (Val2)) \ + __tgmres = Fct##l (Val1, Val2); \ + else \ + __tgmres = Cfct##l (Val1, Val2); \ + } \ + else if (sizeof (__real__ (Val1)) == sizeof (double) \ + || sizeof (__real__ (Val2)) == sizeof(double))\ + { \ + if (sizeof (__real__ (Val1)) == sizeof (Val1) \ + && sizeof (__real__ (Val2)) == sizeof (Val2)) \ + __tgmres = Fct (Val1, Val2); \ + else \ + __tgmres = Cfct (Val1, Val2); \ + } \ + else \ + { \ + if (sizeof (__real__ (Val1)) == sizeof (Val1) \ + && sizeof (__real__ (Val2)) == sizeof (Val2)) \ + __tgmres = Fct##f (Val1, Val2); \ + else \ + __tgmres = Cfct##f (Val1, Val2); \ + } \ + __tgmres; })) #else # error "Unsupported compiler; you cannot use <tgmath.h>" #endif |