* math/tgmath.h: Make nested function calls work.
This commit is contained in:
Ulrich Drepper 1998-10-20 21:18:11 +00:00
parent 10411f2d14
commit 48244d0931
6 changed files with 2011 additions and 73 deletions

View File

@ -1,5 +1,7 @@
1998-10-19 Ulrich Drepper <drepper@cygnus.com> 1998-10-19 Ulrich Drepper <drepper@cygnus.com>
* math/tgmath.h: Make nested function calls work.
* include/ldsodefs.h: Fix typo. * include/ldsodefs.h: Fix typo.
* posix/Makefile (tests): Add tst-preadwrite. * posix/Makefile (tests): Add tst-preadwrite.

26
FAQ
View File

@ -89,6 +89,7 @@ please let me know.
which is not acceptable for me. What can I do? which is not acceptable for me. What can I do?
2.22. I just upgraded my Linux system to glibc and now I get 2.22. I just upgraded my Linux system to glibc and now I get
errors whenever I try to link any program. errors whenever I try to link any program.
2.23. When I use nscd the machine freezes.
3. Source and binary incompatibilities, and what to do about them 3. Source and binary incompatibilities, and what to do about them
@ -223,16 +224,16 @@ to them.
1.5. Which compiler should I use for powerpc? 1.5. Which compiler should I use for powerpc?
{GK} You want to use egcs 1.0.1 or later (together with the right versions {GK} You want to use egcs 1.1 or later (together with the right versions
of all the other tools, of course). of all the other tools, of course).
In fact, egcs 1.0.1 has a serious bug that prevents a clean make, relating In fact, egcs 1.1 has a bug that causes linuxthreads to be
to switch statement folding. It also causes the resulting shared libraries miscompiled, resulting in segmentation faults when using condition
to use more memory than they should. There is a patch at: variables. There is a temporary patch at:
<http://discus.anu.edu.au/~geoffk/egcs-1.0.1-geoffk.diff> <http://discus.anu.edu.au/~geoffk/egcs-3.diff>
Later versions of egcs may fix these problems. Later versions of egcs may fix this problem.
1.6. Do I need some more things to compile GNU C Library? 1.6. Do I need some more things to compile GNU C Library?
@ -889,6 +890,19 @@ an installation of glibc that is configured with --prefix=/usr should help
detect these situations. If the script reports problems, something is detect these situations. If the script reports problems, something is
really screwed up. really screwed up.
2.23. When I use nscd the machine freezes.
{UD} It is well known that you cannot use nscd with Linux 2.0.*. There
is functionality missing in the kernel and work-arounds are not suitable.
Beside this some parts of the kernel are too buggy when it comes to using
threads.
So you have the possibilities to run Linux 2.0.* or update to a higher
version and start using nscd.
Note that I have at this point no information about any other platform.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12
FAQ.in
View File

@ -731,6 +731,18 @@ an installation of glibc that is configured with --prefix=/usr should help
detect these situations. If the script reports problems, something is detect these situations. If the script reports problems, something is
really screwed up. really screwed up.
?? When I use nscd the machine freezes.
{UD} It is well known that you cannot use nscd with Linux 2.0.*. There
is functionality missing in the kernel and work-arounds are not suitable.
Beside this some parts of the kernel are too buggy when it comes to using
threads.
So you have the possibilities to run Linux 2.0.* or update to a higher
version and start using nscd.
Note that I have at this point no information about any other platform.
? Source and binary incompatibilities, and what to do about them ? Source and binary incompatibilities, and what to do about them
?? I expect GNU libc to be 100% source code compatible with ?? I expect GNU libc to be 100% source code compatible with

1508
INTERFACE Normal file

File diff suppressed because it is too large Load Diff

360
NEWS
View File

@ -55,8 +55,30 @@ Version 2.1
* An implementation of profiling shared libraries was added by Ulrich Drepper. * An implementation of profiling shared libraries was added by Ulrich Drepper.
* Thorsten Kukuk provided an implementation for a caching daemon for NSS * Thorsten Kukuk and Ulrich Drepper provided an implementation for a caching
(nscd). daemon for NSS (nscd).
Missing a better place here are some numbers on improvements. Under
Linux 2.1.125 un-tar-ing the kernel sources takes
user system wall
using local files 12.19s 6.88s 22.91s
using NIS 13.92s 8.91s 26.34s
using NIS & nscd 10.37s 7.34s 25.30s
using NIS & old nscd [1] 13.83s 8.32s 29.60s
When NIS+ is used instead of NIS the benefit from using nscd is much bigger.
Keep in mind that non-namelookup related operations dominate above times.
It was just a common complain that using NIS+ unpacking the kernel is
horribly slow. When using nscd unpacking is now even faster than using
NIS.
[1] The old nscd implementation is not anymore available since it was
distributed with glibc up to version 2.0.98.
* Tim Waugh provided an implementation of the POSIX.2 wordexp function family. * Tim Waugh provided an implementation of the POSIX.2 wordexp function family.
@ -66,6 +88,340 @@ Version 2.1
and $PLATFORM) in RPATHs and similar strings (Ulrich Drepper). and $PLATFORM) in RPATHs and similar strings (Ulrich Drepper).
* rcmd can now handle netgroups (Dick Streefland). * rcmd can now handle netgroups (Dick Streefland).
* Interface changes relative to the latest 2.0.x release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
addseverity NEW: fmtmsg
alphasort64 NEW: LFS
argp_err_exit_status NEW: argp
argp_error NEW: argp
argp_failure NEW: argp
argp_help NEW: argp
argp_parse NEW: argp
argp_program_bug_address NEW: argp
argp_program_version NEW: argp
argp_program_version_hook NEW: argp
argp_state_help NEW: argp
argp_usage NEW: argp
authdes_create NEW: NIS+
authdes_getucred NEW: NIS+
authdes_pk_create NEW: NIS+
backtrace NEW: GNU ext.
backtrace_symbols NEW: GNU ext.
backtrace_symbols_fd NEW: GNU ext.
cacos NEW: ISO C 9x
cacosf NEW: ISO C 9x
cacosh NEW: ISO C 9x
cacoshf NEW: ISO C 9x
cacoshl NEW: ISO C 9x
cacosl NEW: ISO C 9x
capget NEW: kernel
capset NEW: kernel
carg NEW: ISO C 9x
cargf NEW: ISO C 9x
cargl NEW: ISO C 9x
casin NEW: ISO C 9x
casinf NEW: ISO C 9x
casinh NEW: ISO C 9x
casinhf NEW: ISO C 9x
casinhl NEW: ISO C 9x
casinl NEW: ISO C 9x
catan NEW: ISO C 9x
catanf NEW: ISO C 9x
catanh NEW: ISO C 9x
catanhf NEW: ISO C 9x
catanhl NEW: ISO C 9x
catanl NEW: ISO C 9x
cbc_crypt NEW: NIS+
ccos NEW: ISO C 9x
ccosf NEW: ISO C 9x
ccosh NEW: ISO C 9x
ccoshf NEW: ISO C 9x
ccoshl NEW: ISO C 9x
ccosl NEW: ISO C 9x
cexp NEW: ISO C 9x
cexpf NEW: ISO C 9x
cexpl NEW: ISO C 9x
cimag NEW: ISO C 9x
cimagf NEW: ISO C 9x
cimagl NEW: ISO C 9x
clearerr_locked REMOVED
clntunix_create NEW: sunrpc ext
clog NEW: ISO C 9x
clog10 NEW: ISO C 9x
clog10f NEW: ISO C 9x
clog10l NEW: ISO C 9x
clogf NEW: ISO C 9x
clogl NEW: ISO C 9x
conj NEW: ISO C 9x
conjf NEW: ISO C 9x
conjl NEW: ISO C 9x
cpow NEW: ISO C 9x
cpowf NEW: ISO C 9x
cpowl NEW: ISO C 9x
cproj NEW: ISO C 9x
cprojf NEW: ISO C 9x
cprojl NEW: ISO C 9x
creal NEW: ISO C 9x
crealf NEW: ISO C 9x
creall NEW: ISO C 9x
creat64 NEW: LFS
csin NEW: ISO C 9x
csinf NEW: ISO C 9x
csinh NEW: ISO C 9x
csinhf NEW: ISO C 9x
csinhl NEW: ISO C 9x
csinl NEW: ISO C 9x
csqrt NEW: ISO C 9x
csqrtf NEW: ISO C 9x
csqrtl NEW: ISO C 9x
ctan NEW: ISO C 9x
ctanf NEW: ISO C 9x
ctanh NEW: ISO C 9x
ctanhf NEW: ISO C 9x
ctanhl NEW: ISO C 9x
ctanl NEW: ISO C 9x
des_setparity NEW: NIS+
ecb_crypt NEW: NIS+
endutxent NEW: utmpx
exp10 NEW: ISO C 9x
exp10f NEW: ISO C 9x
exp10l NEW: ISO C 9x
exp2 NEW: ISO C 9x
exp2f NEW: ISO C 9x
exp2l NEW: ISO C 9x
fattach NEW: STREAMS
fdetach NEW: STREAMS
fdim NEW: ISO C 9x
fdimf NEW: ISO C 9x
fdiml NEW: ISO C 9x
feclearexcept NEW: ISO C 9x
fegetenv NEW: ISO C 9x
fegetexceptflag NEW: ISO C 9x
fegetround NEW: ISO C 9x
feholdexcept NEW: ISO C 9x
feof_locked REMOVED
feraiseexcept NEW: ISO C 9x
ferror_locked REMOVED
fesetenv NEW: ISO C 9x
fesetexceptflag NEW: ISO C 9x
fesetround NEW: ISO C 9x
fetestexcept NEW: ISO C 9x
feupdateenv NEW: ISO C 9x
fflush_locked REMOVED
ffsl NEW: GNU ext.
ffsll NEW: GNU ext.
fgetpos64 NEW: LFS
fgets_unlocked NEW: GNU ext.
fileno_locked REMOVED
fma NEW: ISO C 9x
fmaf NEW: ISO C 9x
fmal NEW: ISO C 9x
fmax NEW: ISO C 9x
fmaxf NEW: ISO C 9x
fmaxl NEW: ISO C 9x
fmin NEW: ISO C 9x
fminf NEW: ISO C 9x
fminl NEW: ISO C 9x
fmtmsg NEW: fmtmsg
fopen64 NEW: LFS
fputc_locked REMOVED
fputs_unlocked NEW: GNU ext.
fread_unlocked NEW: GNU ext.
freopen64 NEW: LFS
fseeko NEW: Unix98
fsetpos64 NEW: LFS
fstatfs64 NEW: LFS
fstatvfs NEW: Unix98
fstatvfs64 NEW: LFS
ftello NEW: Unix98
ftello64 NEW: LFS
ftruncate64 NEW: LFS
ftw64 NEW: LFS
fwrite_unlocked NEW: GNU ext.
gai_strerror NEW: IPv6
gamma_r REMOVED
gammaf_r REMOVED
gammal_r REMOVED
getchar_locked REMOVED
getdate NEW: Unix98
getdate_err NEW: Unix98
getdate_r NEW: GNU ext.
getmsg NEW: STREAMS
getnameinfo NEW: IPv6
getnetname NEW: IPv6
getpmsg NEW: STREAMS
getpt NEW: Unix98 PTY
getrlimit64 NEW: LFS
getutxent NEW: utmpx
getutxid NEW: utmpx
getutxline NEW: utmpx
glob64 NEW: GNU ext.
globfree64 NEW: GNU ext.
gnu_get_libc_release NEW: GNU ext.
gnu_get_libc_version NEW: GNU ext.
grantpt NEW: Unix98 PTY
host2netname NEW: IPv6
iconv NEW: iconv
iconv_close NEW: iconv
iconv_open NEW: iconv
if_freenameindex NEW: IPv6
if_indextoname NEW: IPv6
if_nameindex NEW: IPv6
if_nametoindex NEW: IPv6
in6addr_any NEW: IPv6
in6addr_loopback NEW: IPv6
inet6_isipv4mapped NEW: IPv6
isastream NEW: STREAMS
iswblank NEW: GNU ext.
key_decryptsession NEW: NIS+
key_decryptsession_pk NEW: NIS+
key_encryptsession NEW: NIS+
key_encryptsession_pk NEW: NIS+
key_gendes NEW: NIS+
key_get_conv NEW: NIS+
key_secretkey_is_set NEW: NIS+
key_setnet NEW: NIS+
key_setsecret NEW: NIS+
llrint NEW: ISO C 9x
llrintf NEW: ISO C 9x
llrintl NEW: ISO C 9x
llround NEW: ISO C 9x
llroundf NEW: ISO C 9x
llroundl NEW: ISO C 9x
log2 NEW: ISO C 9x
log2f NEW: ISO C 9x
log2l NEW: ISO C 9x
lrint NEW: ISO C 9x
lrintf NEW: ISO C 9x
lrintl NEW: ISO C 9x
lround NEW: ISO C 9x
lroundf NEW: ISO C 9x
lroundl NEW: ISO C 9x
lseek64 NEW: LFS
makecontext NEW: Unix98
mempcpy NEW: GNU ext.
mmap64 NEW: LFS
moncontrol REMOVED
modify_ldt NEW: kernel
nan NEW: ISO C 9x
nanf NEW: ISO C 9x
nanl NEW: ISO C 9x
nearbyint NEW: ISO C 9x
nearbyintf NEW: ISO C 9x
nearbyintl NEW: ISO C 9x
netname2host NEW: IPv6
netname2user NEW: IPv6
nextafterx NEW: ISO C 9x
nextafterxf NEW: ISO C 9x
nftw NEW: Unix98
nftw64 NEW: LFS
open64 NEW: LFS
passwd2des NEW: NIS+
pow10 NEW: GNU ext.
pow10f NEW: GNU ext.
pow10l NEW: GNU ext.
pread NEW: Unix98
pread64 NEW: LFS
printf_size NEW: GNU ext.
printf_size_info NEW: GNU ext.
profil_counter REMOVED
pthread_mutexattr_getkind_np REPLACED
pthread_mutexattr_setkind_np REPLACED
ptsname NEW: Unix98 PTY
ptsname_r NEW: Unix98 PTY
putc_locked REMOVED
putchar_locked REMOVED
putgrent NEW: GNU ext.
putmsg NEW: STREAMS
putpmsg NEW: STREAMS
pututxline NEW: utmpx
pwrite NEW: Unix98
pwrite64 NEW: LFS
readdir64 NEW: LFS
readdir64_r NEW: LFS
remquo NEW: ISO C 9x
remquof NEW: ISO C 9x
remquol NEW: ISO C 9x
round NEW: ISO C 9x
roundf NEW: ISO C 9x
roundl NEW: ISO C 9x
rtime NEW: GNU ext.
scalbln NEW: ISO C 9x
scalblnf NEW: ISO C 9x
scalblnl NEW: ISO C 9x
scandir64 NEW: LFS
sendfile NEW: kernel
setcontext NEW: Unix98
setrlimit64 NEW: LFS
setutxent NEW: utmpx
sighold NEW: Unix98
sigignore NEW: Unix98
sigqueue NEW: POSIX.1b
sigrelse NEW: Unix98
sigset NEW: POSIX.1b
sigtimedwait NEW: POSIX.1b
sigwaitinfo NEW: POSIX.1b
sincos NEW: GNU ext.
sincosf NEW: GNU ext.
sincosl NEW: GNU ext.
statfs64 NEW: LFS
statvfs NEW: Unix98
statvfs64 NEW: LFS
strcasestr NEW: GNU ext.
strfxtime NEW: ISO C 9x
strtoimax NEW: ISO C 9x
strtoumax NEW: ISO C 9x
strverscmp NEW: GNU ext.
svcauthdes_stats NEW: NIS+
svcunix_create NEW: sunrpc etx
svcunixfd_create NEW: sunrpc ext
swapcontext NEW: Unix98
tcgetsid NEW: Unix98 PTY
tdestroy NEW: GNU ext.
tgamma NEW: ISO C 9x
tgammaf NEW: ISO C 9x
tgammal NEW: ISO C 9x
tmpfile64 NEW: LFS
trunc NEW: ISO C 9x
truncate64 NEW: LFS
truncf NEW: ISO C 9x
truncl NEW: ISO C 9x
umount2 NEW: kernel
unlockpt NEW: Unix98 PTY
updwtmpx NEW: utmpx
user2netname NEW: IPv6
utmpxname NEW: utmpx
versionsort NEW: GNU ext.
versionsort64 NEW: LFS
waitid NEW: Unix98
wcscasecmp NEW: GNU ext.
wcsncasecmp NEW: GNU ext.
wcsnlen NEW: GNU ext.
wcstoimax NEW: ISO C 9x
wcstoll NEW: ISO C 9x
wcstoull NEW: ISO C 9x
wcstoumax NEW: ISO C 9x
wcswcs NEW: Unix98
wordexp NEW: POSIX.2
wordfree NEW: POSIX.2
write_profiling REMOVED
xdecrypt NEW: NIS+
xdr_authdes_cred NEW: NIS+
xdr_authdes_verf NEW: NIS+
xdr_cryptkeyarg NEW: NIS+
xdr_cryptkeyarg2 NEW: NIS+
xdr_cryptkeyres NEW: NIS+
xdr_getcredres NEW: NIS+
xdr_key_netstarg NEW: NIS+
xdr_key_netstres NEW: NIS+
xdr_keybuf NEW: NIS+
xdr_keystatus NEW: NIS+
xdr_netnamestr NEW: NIS+
xdr_sizeof NEW: NIS+
xdr_unixcred NEW: sunrpc ext
xencrypt NEW: NIS+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Version 2.0.5 Version 2.0.5

View File

@ -40,87 +40,133 @@
only defined on real valued parameters and those which are defined only defined on real valued parameters and those which are defined
for complex functions as well. */ for complex functions as well. */
# define __TGMATH_UNARY_REAL_ONLY(Val, Fct) \ # define __TGMATH_UNARY_REAL_ONLY(Val, Fct) \
(__extension__ (sizeof (Val) == sizeof (double) \ (__extension__ ({ __typeof__ (Val) __tgmres; \
? Fct (Val) \ if (sizeof (Val) == sizeof (double)) \
: (sizeof (Val) == sizeof (long double) \ __tgmres = Fct (Val); \
? Fct##l (Val) \ else if (sizeof (Val) == sizeof (float)) \
: Fct##f (Val)))) __tgmres = Fct##f (Val); \
else \
__tgmres = Fct##l (Val); \
__tgmres; }))
# define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \ # define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \ (__extension__ ({ __typeof__ (Val1) __tgmres; \
? Fct##l (Val1, Val2) \ if (sizeof (Val1) == sizeof (double)) \
: (sizeof (Val1) == sizeof (double) \ __tgmres = Fct (Val1, Val2); \
? Fct (Val1, Val2) \ else if (sizeof (Val1) == sizeof (float)) \
: Fct##f (Val1, Val2)))) __tgmres = Fct##f (Val1, Val2); \
else \
__tgmres = Fct##l (Val1, Val2); \
__tgmres; }))
# define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \ # define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \ (__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \
|| sizeof (Val2) > sizeof (double) \ if (sizeof (Val1) > sizeof (double) \
? Fct##l (Val1, Val2) \ || sizeof (Val2) > sizeof (double)) \
: (sizeof (Val1) == sizeof (double) \ __tgmres = Fct##l (Val1, Val2); \
|| sizeof (Val2) == sizeof (double) \ else if (sizeof (Val1) == sizeof (double) \
? Fct (Val1, Val2) \ || sizeof (Val2) == sizeof (double)) \
: Fct##f (Val1, Val2)))) __tgmres = Fct (Val1, Val2); \
else \
__tgmres = Fct (Val1, Val2); \
__tgmres; }))
# define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \ # define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \ (__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \
|| sizeof (Val2) > sizeof (double) \ if (sizeof (Val1) > sizeof (double) \
? Fct##l (Val1, Val2, Val3) \ || sizeof (Val2) > sizeof (double)) \
: (sizeof (Val1) == sizeof (double) \ __tgmres = Fct##l (Val1, Val2, Val3); \
|| sizeof (Val2) == sizeof (double) \ else if (sizeof (Val1) == sizeof (double) \
? Fct (Val1, Val2, Val3) \ || sizeof (Val2) == sizeof (double)) \
: Fct##f (Val1, Val2, Val3)))) __tgmres = Fct (Val1, Val2, Val3); \
else \
__tgmres = Fct (Val1, Val2, Val3); \
__tgmres; }))
# define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \ # define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
(__extension__ (sizeof (Val1) > sizeof (double) \ (__extension__ ({ __typeof__ ((Val1) + (Val2) + (Val3)) __tgmres; \
|| sizeof (Val2) > sizeof (double) \ if (sizeof (Val1) > sizeof (double) \
|| sizeof (Val3) > sizeof (double) \ || sizeof (Val2) > sizeof (double) \
? Fct##l (Val1, Val2, Val3) \ || sizeof (Val3) > sizeof (double)) \
: (sizeof (Val1) == sizeof (double) \ __tgmres = Fct##l (Val1, Val2, Val3); \
|| sizeof (Val2) == sizeof (double) \ else if (sizeof (Val1) == sizeof (double) \
|| sizeof (Val3) == sizeof (double) \ || sizeof (Val2) == sizeof (double) \
? Fct (Val1, Val2, Val3) \ || sizeof (Val3) == sizeof (double)) \
: Fct##f (Val1, Val2, Val3)))) __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) \ # define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
(__extension__ (sizeof (__real__ (Val)) > sizeof (double) \ (__extension__ ({ __typeof__ (Val) __tgmres; \
? (sizeof (__real__ (Val)) == sizeof (Val) \ if (sizeof (__real__ (Val)) > sizeof (double)) \
? Fct##l (Val) \ { \
: Cfct##l (Val)) \ if (sizeof (__real__ (Val)) == sizeof (Val)) \
: (sizeof (__real__ (Val)) == sizeof (double) \ __tgmres = Fct##l (Val); \
? (sizeof (__real__ (Val)) == sizeof (Val) \ else \
? Fct (Val) \ __tgmres = Cfct##l (Val); \
: Cfct (Val)) \ } \
: (sizeof (__real__ (Val)) == sizeof (Val) \ else if (sizeof (__real__ (Val)) == sizeof (double)) \
? Fct##f (Val) \ { \
: Cfct##f (Val))))) 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 /* XXX This definition has to be changed as soon as the compiler understands
the imaginary keyword. */ the imaginary keyword. */
# define __TGMATH_UNARY_IMAG_ONLY(Val, Fct) \ # define __TGMATH_UNARY_IMAG_ONLY(Val, Fct) \
(__extension__ (sizeof (Val) > sizeof (__complex__ double) \ (__extension__ ({ __typeof__ (Val) __tgmres; \
? Fct##l (Val) \ if (sizeof (Val) == sizeof (__complex__ double)) \
: (sizeof (Val) == sizeof (__complex__ double) \ __tgmres = Fct (Val); \
? Fct (Val) \ else if (sizeof (Val) == sizeof (__complex__ float)) \
: Fct##f (Val)))) __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) \ # define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
(__extension__ (sizeof (__real__ (Val1)) > sizeof (double) \ (__extension__ ({ __typeof__ ((Val1) + (Val2)) __tgmres; \
|| sizeof (__real__ (Val2)) > sizeof (double) \ if (sizeof (__real__ (Val1)) > sizeof (double) \
? (sizeof (__real__ (Val1)) == sizeof (Val1) \ || sizeof (__real__ (Val2)) > sizeof (double)) \
&& sizeof (__real__ (Val2)) == sizeof (Val2) \ { \
? Fct##l (Val1, Val2) \ if (sizeof (__real__ (Val1)) == sizeof (Val1) \
: Cfct##l (Val1, Val2)) \ && sizeof (__real__ (Val2)) == sizeof (Val2)) \
: (sizeof (__real__ (Val1)) == sizeof (double) \ __tgmres = Fct##l (Val1, Val2); \
|| sizeof (__real__ (Val2)) == sizeof (double) \ else \
? (sizeof (__real__ (Val1)) == sizeof (Val1) \ __tgmres = Cfct##l (Val1, Val2); \
&& sizeof (__real__ (Val2)) == sizeof (Val2) \ } \
? Fct (Val1, Val2) \ else if (sizeof (__real__ (Val1)) == sizeof (double) \
: Cfct (Val1, Val2)) \ || sizeof (__real__ (Val2)) == sizeof(double))\
: (sizeof (__real__ (Val1)) == sizeof (Val1) \ { \
&& sizeof (__real__ (Val2)) == sizeof (Val2) \ if (sizeof (__real__ (Val1)) == sizeof (Val1) \
? Fct##f (Val1, Val2) \ && sizeof (__real__ (Val2)) == sizeof (Val2)) \
: Cfct##f (Val1, 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 #else
# error "Unsupported compiler; you cannot use <tgmath.h>" # error "Unsupported compiler; you cannot use <tgmath.h>"
#endif #endif