aboutsummaryrefslogtreecommitdiff
path: root/math
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-06-28 16:31:10 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-06-28 16:31:10 +0000
commitd12a22c5d351cd1cc125a6345a949dfbc20f6f91 (patch)
treefb95acef62127f7ced4626637f49a141ea4f82de /math
parentcfa44345234e161cb59987ed70e04719ba155867 (diff)
downloadglibc-d12a22c5d351cd1cc125a6345a949dfbc20f6f91.zip
glibc-d12a22c5d351cd1cc125a6345a949dfbc20f6f91.tar.gz
glibc-d12a22c5d351cd1cc125a6345a949dfbc20f6f91.tar.bz2
Fix tgmath.h totalorder, totalordermag return type (bug 21687).
The tgmath.h totalorder and totalordermag macros wrongly return a floating-point type. They should return int, like the underlying functions. This patch fixes them accordingly, updating tests including enabling tests of those functions from gen-tgmath-tests.py. Tested for x86_64. [BZ #21687] * math/tgmath.h (__TGMATH_BINARY_REAL_RET_ONLY): New macro. (totalorder): Use it. (totalordermag): Likewise. * math/gen-tgmath-tests.py (Tests.add_all_tests): Enable tests of totalorder and totalordermag. * math/test-tgmath.c (F(compile_test)): Do not call totalorder or totalordermag in arguments of calls to those functions. (NCALLS): Change to 134.
Diffstat (limited to 'math')
-rwxr-xr-xmath/gen-tgmath-tests.py4
-rw-r--r--math/test-tgmath.c6
-rw-r--r--math/tgmath.h20
3 files changed, 21 insertions, 9 deletions
diff --git a/math/gen-tgmath-tests.py b/math/gen-tgmath-tests.py
index 3dbd874..db6553e 100755
--- a/math/gen-tgmath-tests.py
+++ b/math/gen-tgmath-tests.py
@@ -549,8 +549,8 @@ class Tests(object):
self.add_tests('fromfpx', 'intmax_t', ['r', 'int', 'unsigned int'])
self.add_tests('ufromfp', 'uintmax_t', ['r', 'int', 'unsigned int'])
self.add_tests('ufromfpx', 'uintmax_t', ['r', 'int', 'unsigned int'])
- #self.add_tests('totalorder', 'int', ['r', 'r'])
- #self.add_tests('totalordermag', 'int', ['r', 'r'])
+ self.add_tests('totalorder', 'int', ['r', 'r'])
+ self.add_tests('totalordermag', 'int', ['r', 'r'])
# The functions that round their result to a narrower type,
# and the associated type-generic macros, are not yet
# supported by this script or by glibc.
diff --git a/math/test-tgmath.c b/math/test-tgmath.c
index dc24cd6..0f3e2e5 100644
--- a/math/test-tgmath.c
+++ b/math/test-tgmath.c
@@ -52,7 +52,7 @@ int count_cdouble;
int count_cfloat;
int count_cldouble;
-#define NCALLS 138
+#define NCALLS 134
#define NCALLS_INT 4
#define NCCALLS 47
@@ -295,8 +295,8 @@ F(compile_test) (void)
b = fmaxmag (fmaxmag (a, x), fmaxmag (c, b));
a = fminmag (fminmag (x, a), fminmag (c, b));
b = fma (sin (a), sin (x), sin (c));
- a = totalorder (totalorder (x, b), totalorder (c, x));
- b = totalordermag (totalordermag (x, a), totalordermag (c, x));
+ a = totalorder (x, b);
+ b = totalordermag (x, a);
#ifdef TEST_INT
a = atan2 (i, b);
diff --git a/math/tgmath.h b/math/tgmath.h
index a70dfe1..a0da104 100644
--- a/math/tgmath.h
+++ b/math/tgmath.h
@@ -112,6 +112,18 @@
+ (__tgmath_real_type (Val2)) 0)) \
Fct##f (Val1, Val2)))
+# define __TGMATH_BINARY_REAL_RET_ONLY(Val1, Val2, Fct) \
+ (__extension__ (((sizeof (Val1) > sizeof (double) \
+ || sizeof (Val2) > sizeof (double)) \
+ && __builtin_classify_type ((Val1) + (Val2)) == 8) \
+ ? __tgml(Fct) (Val1, Val2) \
+ : (sizeof (Val1) == sizeof (double) \
+ || sizeof (Val2) == sizeof (double) \
+ || __builtin_classify_type (Val1) != 8 \
+ || __builtin_classify_type (Val2) != 8) \
+ ? Fct (Val1, Val2) \
+ : Fct##f (Val1, Val2)))
+
# define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
(__extension__ (((sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double)) \
@@ -471,12 +483,12 @@
# define fminmag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminmag)
/* Total order operation. */
-# define totalorder(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, \
- totalorder)
+# define totalorder(Val1, Val2) \
+ __TGMATH_BINARY_REAL_RET_ONLY (Val1, Val2, totalorder)
/* Total order operation on absolute values. */
-# define totalordermag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, \
- totalordermag)
+# define totalordermag(Val1, Val2) \
+ __TGMATH_BINARY_REAL_RET_ONLY (Val1, Val2, totalordermag)
#endif