From 301a6724af4f63ea696658ec7f4cded7b88f7a0e Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 16 Jun 2003 08:03:44 +0000 Subject: Update. * math/tgmath.h (__TGMATH_UNARY_IMAG_ONLY): Removed. 2003-06-15 Andreas Jaeger * sysdeps/i386/fpu/feenablxcpt.c (feenableexcept): Correct setting of MXCSR. * sysdeps/i386/fpu/fedisblxcpt.c (fedisableexcept): Likewise. * sysdeps/i386/fpu/feholdexcpt.c (feholdexcept): Likewise. Reported by Arnaud Desitter . * math/tgmath.h (carg): Handle real arguments. (conj): Likewise. (cproj): Likewise. (cimag): Likewise. (creal): Likewise. * math/Makefile (CFLAGS-test-tgmath-ret.c): New. (tests): Add test-tgmath-ret. * math/test-tgmath-ret.c: New file. * math/tgmath.h (ilogb): Return always an int. 2003-06-16 Ulrich Drepper computation so that prelinking works. --- math/Makefile | 3 +- math/test-tgmath-ret.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++ math/tgmath.h | 25 ++++----------- 3 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 math/test-tgmath-ret.c (limited to 'math') diff --git a/math/Makefile b/math/Makefile index dc470d2310..e34d41ce98 100644 --- a/math/Makefile +++ b/math/Makefile @@ -87,7 +87,7 @@ distribute += $(filter-out $(generated),$(long-m-yes:=.c) $(long-c-yes:=.c)) # Rules for the test suite. tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \ - test-misc test-fpucw tst-definitions test-tgmath + test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret # We do the `long double' tests only if this data type is available and # distinct from `double'. test-longdouble-yes = test-ldouble test-ildoubl @@ -126,6 +126,7 @@ CFLAGS-test-float.c = -fno-inline -ffloat-store CFLAGS-test-double.c = -fno-inline -ffloat-store CFLAGS-test-ldouble.c = -fno-inline -ffloat-store CFLAGS-test-tgmath.c = -fno-builtin +CFLAGS-test-tgmath-ret.c = -fno-builtin CPPFLAGS-test-ifloat.c = -U__LIBC_INTERNAL_MATH_INLINES -D__FAST_MATH__ \ -DTEST_FAST_MATH CPPFLAGS-test-idouble.c = -U__LIBC_INTERNAL_MATH_INLINES -D__FAST_MATH__ \ diff --git a/math/test-tgmath-ret.c b/math/test-tgmath-ret.c new file mode 100644 index 0000000000..8eef64986a --- /dev/null +++ b/math/test-tgmath-ret.c @@ -0,0 +1,85 @@ +/* Test compilation of tgmath macros. + Copyright (C) 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 2003. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include +#include + +static float fx; +static double dx; +static long double lx; +static int errors = 0; + +static void +our_error (const char *c) +{ + puts (c); + ++errors; +} + +/* First function where the return type is constant. */ + +#define CHECK_RET_CONST_TYPE(func, rettype, arg, name) \ + if (sizeof (func (arg)) != sizeof (rettype)) \ + our_error ("Return size of " #func " is wrong with " #name " argument"); + +#define CHECK_RET_CONST_FLOAT(func, rettype) \ + CHECK_RET_CONST_TYPE (func, rettype, fx, float) +#define CHECK_RET_CONST_DOUBLE(func, rettype) \ + CHECK_RET_CONST_TYPE (func, rettype, dx, double) +#ifdef NO_LONG_DOUBLE +# define CHECK_RET_CONST_LDOUBLE(func, rettype) +#else +# define CHECK_RET_CONST_LDOUBLE(func, rettype) \ + CHECK_RET_CONST_TYPE (func, rettype, lx, long double) +#endif + +#define CHECK_RET_CONST(func, rettype) \ +static void \ +check_return_ ##func (void) \ +{ \ + CHECK_RET_CONST_FLOAT (func, rettype) \ + CHECK_RET_CONST_DOUBLE (func, rettype) \ + CHECK_RET_CONST_LDOUBLE (func, rettype) \ +} + +CHECK_RET_CONST(ilogb, int) +CHECK_RET_CONST(lrint, long) +CHECK_RET_CONST(lround, long) +CHECK_RET_CONST(llrint, long long) +CHECK_RET_CONST(llround, long long) + +static int +do_test (void) +{ + check_return_ilogb (); + check_return_lrint (); + check_return_lround (); + check_return_llrint (); + check_return_llround (); + + printf ("%Zd\n", sizeof(carg (lx))); + + return errors != 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/math/tgmath.h b/math/tgmath.h index 8b75cb5148..168b262e68 100644 --- a/math/tgmath.h +++ b/math/tgmath.h @@ -175,19 +175,6 @@ } \ __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__ ({ __tgmath_real_type (Val) __tgmres; \ - if (sizeof (Val) == sizeof (__complex__ double) \ - || __builtin_classify_type (__real__ (Val)) != 8) \ - __tgmres = Fct (Val); \ - else if (sizeof (Val) == sizeof (__complex__ float)) \ - __tgmres = Fct##f (Val); \ - else \ - __tgmres = __tgml(Fct) (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) \ @@ -400,7 +387,7 @@ __TGMATH_BINARY_FIRST_REAL_ONLY (Val1, Val2, scalbln) /* Return the binary exponent of X, which must be nonzero. */ -#define ilogb(Val) __TGMATH_UNARY_REAL_ONLY (Val, ilogb) +#define ilogb(Val) __TGMATH_UNARY_REAL_RET_ONLY (Val, int, ilogb) /* Return positive difference between X and Y. */ @@ -421,21 +408,21 @@ /* Absolute value, conjugates, and projection. */ /* Argument value of Z. */ -#define carg(Val) __TGMATH_UNARY_IMAG_ONLY (Val, carg) +#define carg(Val) __TGMATH_UNARY_REAL_IMAG (Val, carg, carg) /* Complex conjugate of Z. */ -#define conj(Val) __TGMATH_UNARY_IMAG_ONLY (Val, conj) +#define conj(Val) __TGMATH_UNARY_REAL_IMAG (Val, conj, conj) /* Projection of Z onto the Riemann sphere. */ -#define cproj(Val) __TGMATH_UNARY_IMAG_ONLY (Val, cproj) +#define cproj(Val) __TGMATH_UNARY_REAL_IMAG (Val, cproj, cproj) /* Decomposing complex values. */ /* Imaginary part of Z. */ -#define cimag(Val) __TGMATH_UNARY_IMAG_ONLY (Val, cimag) +#define cimag(Val) __TGMATH_UNARY_REAL_IMAG (Val, cimag, cimag) /* Real part of Z. */ -#define creal(Val) __TGMATH_UNARY_IMAG_ONLY (Val, creal) +#define creal(Val) __TGMATH_UNARY_REAL_IMAG (Val, creal, creal) #endif /* tgmath.h */ -- cgit v1.2.3