This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Fix tgmath.h (take 2)


On Thu, Jan 25, 2001 at 04:04:21PM +0100, Andreas Jaeger wrote:
> Jakub Jelinek <jakub@redhat.com> writes:
> 
> > Hi!
> > 
> > We have too many opening parens (resp. too few closing ones, your decision)
> > which is a bad thing.
> > Maybe we should cook up some test which will include tgmath.h and use all
> > functions declared there just to make sure it can be compiled.
> 
> Feel free to send a test - that would be quite usefull,

Ouch, looks like a proper testcase is badly needed.
Here is an updated patch with stuff I found out when trying to compile:
#define _GNU_SOURCE
#include <math.h>
#include <tgmath.h>

double x;

void compile_test (void)
{
  double a, b, c;
  int i;
  long int j;
  long long int k;

  a = cos (x);
  b = acos (a);
  a = sin (x);
  b = asin (a);
  a = tan (x);
  b = atan (a);
  c = atan2 (a, b);
  a = cosh (x);
  b = acosh (a);
  a = sinh (x);
  b = asinh (a);
  a = tanh (x);
  b = atanh (a);
  a = exp (x);
  b = log (a);
  a = log10 (x);
  b = ldexp (a, 5);
  a = frexp (x, &i);
  b = expm1 (a);
  a = log1p (x);
  b = logb (a);
  a = exp2 (x);
  b = log2 (a);
  a = pow (x, c);
  b = sqrt (a);
  a = hypot (x, c);
  b = cbrt (a);
  a = ceil (x);
  b = fabs (a);
  a = floor (x);
  b = fmod (a, c);
  a = nearbyint (x);
  b = round (a);
  a = trunc (x);
  b = remquo (a, c, &i);
  j = lrint (x) + lround (a);
  k = llrint (b) + llround (c);
  a = erf (x);
  b = erfc (a);
  a = tgamma (x);
  b = lgamma (a);
  a = rint (x);
  b = nextafter (a, c);
  a = nexttoward (x, c);
  b = remainder (a, c);
  a = scalb (x, 6);
  k = scalbn (a, 7) + scalbln (c, 10LL);
  i = ilogb (x);
  a = fdim (x, c);
  b = fmax (a, c);
  a = fmin (x, c);
  b = fma (a, x, c);
}

int main (void)
{
  return 0;
}

The test should be probably extended quite a bit, so that it e.g. is
compiled with all of float, double, long double, their __complex__ variants
(where appropriate) and even trying various float, double and long double
constants as arguments as well.

2001-01-25  Jakub Jelinek  <jakub@redhat.com>

	* math/tgmath.h (__TGMATH_BINARY_FIRST_REAL_ONLY,
	__TGMATH_BINARY_REAL_ONLY, __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY,
	__TGMATH_TERNARY_REAL_ONLY): Use proper arguments to
	__builtin_classify_type, add ##f suffixes where appropriate.
	(__TGMATH_UNARY_REAL_IMAG): Remove extraneous left parenthesis.
	(__TGMATH_BINARY_REAL_IMAG): Likewise, use proper arguments to
	__builtin_classify_type.
	(fma): Fix spelling of first argument.

--- libc/math/tgmath.h.jj	Tue Aug 22 10:12:56 2000
+++ libc/math/tgmath.h	Thu Jan 25 18:09:04 2001
@@ -71,7 +71,7 @@
 # define __TGMATH_BINARY_FIRST_REAL_ONLY(Val1, Val2, Fct) \
      (__extension__ ({ __tgmath_real_type (Val1) __tgmres;		      \
 		       if (sizeof (Val1) == sizeof (double)		      \
-			   || __builtin_classify_type (Val) != 8)	      \
+			   || __builtin_classify_type (Val1) != 8)	      \
 			 __tgmres = Fct (Val1, Val2);			      \
 		       else if (sizeof (Val1) == sizeof (float))	      \
 			 __tgmres = Fct##f (Val1, Val2);		      \
@@ -83,28 +83,30 @@
      (__extension__ ({ __tgmath_real_type ((Val1) + (Val2)) __tgmres;	      \
 		       if ((sizeof (Val1) > sizeof (double)		      \
 			    || sizeof (Val2) > sizeof (double))		      \
-			   && __builtin_classify_type (Val) == 8)	      \
+			   && __builtin_classify_type ((Val1) + (Val2)) == 8) \
 			 __tgmres = Fct##l (Val1, Val2);		      \
 		       else if (sizeof (Val1) == sizeof (double)	      \
 				|| sizeof (Val2) == sizeof (double)	      \
-				|| __builtin_classify_type (Val) != 8)	      \
+				|| __builtin_classify_type ((Val1)	      \
+							    + (Val2)) != 8)   \
 			 __tgmres = Fct (Val1, Val2);			      \
 		       else						      \
-			 __tgmres = Fct (Val1, Val2);			      \
+			 __tgmres = Fct##f (Val1, Val2);		      \
 		       __tgmres; }))
 
 # define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
      (__extension__ ({ __tgmath_real_type ((Val1) + (Val2)) __tgmres;	      \
 		       if ((sizeof (Val1) > sizeof (double)		      \
 			    || sizeof (Val2) > sizeof (double))		      \
-			   && __builtin_classify_type (Val) == 8)	      \
+			   && __builtin_classify_type ((Val1) + (Val2)) == 8) \
 			 __tgmres = Fct##l (Val1, Val2, Val3);		      \
 		       else if (sizeof (Val1) == sizeof (double)	      \
 				|| sizeof (Val2) == sizeof (double)	      \
-				|| __builtin_classify_type (Val) != 8)	      \
+				|| __builtin_classify_type ((Val1)	      \
+							    + (Val2)) != 8)   \
 			 __tgmres = Fct (Val1, Val2, Val3);		      \
 		       else						      \
-			 __tgmres = Fct (Val1, Val2, Val3);		      \
+			 __tgmres = Fct##f (Val1, Val2, Val3);		      \
 		       __tgmres; }))
 
 # define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
@@ -112,15 +114,17 @@
 		       if ((sizeof (Val1) > sizeof (double)		      \
 			    || sizeof (Val2) > sizeof (double)		      \
 			    || sizeof (Val3) > sizeof (double))		      \
-			   && __builtin_classify_type (Val) == 8)	      \
+			   && __builtin_classify_type ((Val1) + (Val2)	      \
+						       + (Val3)) == 8)	      \
 			 __tgmres = Fct##l (Val1, Val2, Val3);		      \
 		       else if (sizeof (Val1) == sizeof (double)	      \
 				|| sizeof (Val2) == sizeof (double)	      \
 				|| sizeof (Val3) == sizeof (double)	      \
-				|| __builtin_classify_type (Val) != 8)	      \
+				|| __builtin_classify_type ((Val1) + (Val2)   \
+							    + (Val3)) != 8)   \
 			 __tgmres = Fct (Val1, Val2, Val3);		      \
 		       else						      \
-			 __tgmres = Fct (Val1, Val2, Val3);		      \
+			 __tgmres = Fct##f (Val1, Val2, Val3);		      \
 		       __tgmres; }))
 
 /* XXX This definition has to be changed as soon as the compiler understands
@@ -136,8 +140,8 @@
 			     __tgmres = Cfct##l (Val);			      \
 			 }						      \
 		       else if (sizeof (__real__ (Val)) == sizeof (double)    \
-				|| (__builtin_classify_type (__real__ (Val))  \
-				    != 8)				      \
+				|| __builtin_classify_type (__real__ (Val))   \
+				   != 8)				      \
 			 {						      \
 			   if (sizeof (__real__ (Val)) == sizeof (Val))	      \
 			     __tgmres = Fct (Val);			      \
@@ -172,7 +176,9 @@
      (__extension__ ({ __tgmath_real_type ((Val1) + (Val2)) __tgmres;	      \
 		       if ((sizeof (__real__ (Val1)) > sizeof (double)	      \
 			    || sizeof (__real__ (Val2)) > sizeof (double))    \
-			   && __builtin_classify_type (__real__ (Val)) == 8)  \
+			   && __builtin_classify_type (__real__ (Val1)	      \
+						       + __real__ (Val2))     \
+			      == 8)					      \
 			 {						      \
 			   if (sizeof (__real__ (Val1)) == sizeof (Val1)      \
 			       && sizeof (__real__ (Val2)) == sizeof (Val2))  \
@@ -182,8 +188,9 @@
 			 }						      \
 		       else if (sizeof (__real__ (Val1)) == sizeof (double)   \
 				|| sizeof (__real__ (Val2)) == sizeof(double) \
-				|| (__builtin_classify_type (__real__ (Val))  \
-				    != 8)				      \
+				|| __builtin_classify_type (__real__ (Val1)   \
+							    + __real__ (Val2))\
+				   != 8)				      \
 			 {						      \
 			   if (sizeof (__real__ (Val1)) == sizeof (Val1)      \
 			       && sizeof (__real__ (Val2)) == sizeof (Val2))  \
@@ -388,7 +395,7 @@
 
 
 /* Multiply-add function computed as a ternary operation.  */
-#define fma(Vat1, Val2, Val3) \
+#define fma(Val1, Val2, Val3) \
      __TGMATH_TERNARY_REAL_ONLY (Val1, Val2, Val3, fma)
 
 


	Jakub

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]