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.
This commit is contained in:
Joseph Myers 2017-06-28 16:31:10 +00:00
parent cfa4434523
commit d12a22c5d3
4 changed files with 31 additions and 9 deletions

View File

@ -1,5 +1,15 @@
2017-06-28 Joseph Myers <joseph@codesourcery.com> 2017-06-28 Joseph Myers <joseph@codesourcery.com>
[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.
* math/tgmath.h (__TGMATH_UNARY_REAL_RET_ONLY): Do not take or * math/tgmath.h (__TGMATH_UNARY_REAL_RET_ONLY): Do not take or
cast to return type argument. cast to return type argument.
(__TGMATH_TERNARY_FIRST_REAL_RET_ONLY): Likewise. (__TGMATH_TERNARY_FIRST_REAL_RET_ONLY): Likewise.

View File

@ -549,8 +549,8 @@ class Tests(object):
self.add_tests('fromfpx', 'intmax_t', ['r', 'int', 'unsigned int']) self.add_tests('fromfpx', 'intmax_t', ['r', 'int', 'unsigned int'])
self.add_tests('ufromfp', 'uintmax_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('ufromfpx', 'uintmax_t', ['r', 'int', 'unsigned int'])
#self.add_tests('totalorder', 'int', ['r', 'r']) self.add_tests('totalorder', 'int', ['r', 'r'])
#self.add_tests('totalordermag', 'int', ['r', 'r']) self.add_tests('totalordermag', 'int', ['r', 'r'])
# The functions that round their result to a narrower type, # The functions that round their result to a narrower type,
# and the associated type-generic macros, are not yet # and the associated type-generic macros, are not yet
# supported by this script or by glibc. # supported by this script or by glibc.

View File

@ -52,7 +52,7 @@ int count_cdouble;
int count_cfloat; int count_cfloat;
int count_cldouble; int count_cldouble;
#define NCALLS 138 #define NCALLS 134
#define NCALLS_INT 4 #define NCALLS_INT 4
#define NCCALLS 47 #define NCCALLS 47
@ -295,8 +295,8 @@ F(compile_test) (void)
b = fmaxmag (fmaxmag (a, x), fmaxmag (c, b)); b = fmaxmag (fmaxmag (a, x), fmaxmag (c, b));
a = fminmag (fminmag (x, a), fminmag (c, b)); a = fminmag (fminmag (x, a), fminmag (c, b));
b = fma (sin (a), sin (x), sin (c)); b = fma (sin (a), sin (x), sin (c));
a = totalorder (totalorder (x, b), totalorder (c, x)); a = totalorder (x, b);
b = totalordermag (totalordermag (x, a), totalordermag (c, x)); b = totalordermag (x, a);
#ifdef TEST_INT #ifdef TEST_INT
a = atan2 (i, b); a = atan2 (i, b);

View File

@ -112,6 +112,18 @@
+ (__tgmath_real_type (Val2)) 0)) \ + (__tgmath_real_type (Val2)) 0)) \
Fct##f (Val1, Val2))) 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) \ # define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
(__extension__ (((sizeof (Val1) > sizeof (double) \ (__extension__ (((sizeof (Val1) > sizeof (double) \
|| sizeof (Val2) > sizeof (double)) \ || sizeof (Val2) > sizeof (double)) \
@ -471,12 +483,12 @@
# define fminmag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminmag) # define fminmag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, fminmag)
/* Total order operation. */ /* Total order operation. */
# define totalorder(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, \ # define totalorder(Val1, Val2) \
totalorder) __TGMATH_BINARY_REAL_RET_ONLY (Val1, Val2, totalorder)
/* Total order operation on absolute values. */ /* Total order operation on absolute values. */
# define totalordermag(Val1, Val2) __TGMATH_BINARY_REAL_ONLY (Val1, Val2, \ # define totalordermag(Val1, Val2) \
totalordermag) __TGMATH_BINARY_REAL_RET_ONLY (Val1, Val2, totalordermag)
#endif #endif