about summary refs log tree commit diff
path: root/math/tgmath.h
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/tgmath.h
parentcfa44345234e161cb59987ed70e04719ba155867 (diff)
downloadglibc-d12a22c5d351cd1cc125a6345a949dfbc20f6f91.tar.gz
glibc-d12a22c5d351cd1cc125a6345a949dfbc20f6f91.tar.xz
glibc-d12a22c5d351cd1cc125a6345a949dfbc20f6f91.zip
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/tgmath.h')
-rw-r--r--math/tgmath.h20
1 files changed, 16 insertions, 4 deletions
diff --git a/math/tgmath.h b/math/tgmath.h
index a70dfe1f47..a0da104142 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