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]
Other format: [Raw text]

ilogb in tgmath broken


Dinkumware pointed out that ilogb is broken:
http://www.dinkumware.com/conform_c.html#glibc230_results

I'm appending a patch and a testcase.

Ok to commit?

Andreas

2003-06-15  Andreas Jaeger  <aj@suse.de>

	* 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.

============================================================
Index: math/tgmath.h
--- math/tgmath.h	3 Mar 2003 19:39:31 -0000	1.20
+++ math/tgmath.h	15 Jun 2003 16:18:49 -0000
@@ -400,7 +400,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.  */
============================================================
Index: math/Makefile
--- math/Makefile	21 Feb 2003 05:37:51 -0000	1.120
+++ math/Makefile	15 Jun 2003 16:18:49 -0000
@@ -87,7 +87,7 @@ distribute += $(filter-out $(generated),
 
 # 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 -ffloa
 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__ \
============================================================
Index: math/test-tgmath-ret.c
--- math/test-tgmath-ret.c	created
+++ math/test-tgmath-ret.c	2003-06-15 17:47:36.000000000 +0200	1.1
@@ -0,0 +1,82 @@
+/* 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 <aj@suse.de>, 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 <math.h>
+#include <complex.h>
+#include <tgmath.h>
+#include <stdio.h>
+
+float fx;
+double dx;
+long double lx;
+int errors = 0;
+
+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)		\
+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)
+
+int
+main (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;
+}

-- 
 Andreas Jaeger, SuSE Linux AG, aj@suse.de, http://www.suse.de/~aj
  GPG fingerprint = 93A3 365E CE47 B889 DF7F  FED1 389A 563C C272 A126

Attachment: pgp00000.pgp
Description: PGP signature


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