summaryrefslogtreecommitdiff
path: root/math
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-10-20 21:18:11 +0000
committerUlrich Drepper <drepper@redhat.com>1998-10-20 21:18:11 +0000
commit48244d09317581396dc0c22bdb69489dc0ea4c5a (patch)
tree264b5c6adf13451da3abce523a64e459d3535ace /math
parent10411f2d14f7a567c0a38811e111751d33a4b3e8 (diff)
downloadglibc-48244d09317581396dc0c22bdb69489dc0ea4c5a.tar.gz
Update.
* math/tgmath.h: Make nested function calls work.
Diffstat (limited to 'math')
-rw-r--r--math/tgmath.h176
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