about summary refs log tree commit diff
path: root/math/tgmath.h
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-08-02 20:16:05 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-08-02 20:16:05 +0000
commit42df8d5921d9ce28f44694ae943efb432b5e9aa7 (patch)
tree26f13b7bb504926987ad82ac279ddd1896b5fd77 /math/tgmath.h
parentb7f95f493b47abfd8f6320b3492b25a2beaa6aa1 (diff)
downloadglibc-42df8d5921d9ce28f44694ae943efb432b5e9aa7.tar.gz
glibc-42df8d5921d9ce28f44694ae943efb432b5e9aa7.tar.xz
glibc-42df8d5921d9ce28f44694ae943efb432b5e9aa7.zip
Fix tgmath.h for __int128 (bug 21686).
When a tgmath.h macro is passed a double argument and an argument of
type __int128, it generates a call to a long double function (although
the result still gets converted to type double).  __int128 is similar
enough to integer types that it should be handled consistently like
them, so always like double for these macros rather than sometimes
like double and sometimes like long double.  This patch fixes the
logic accordingly and makes gen-tgmath-tests.py generate tests for
__int128.

Tested for x86_64 and x86.

	[BZ #21686]
	* math/tgmath.h (__TGMATH_BINARY_REAL_ONLY): Add arguments before
	comparing size with that of double.
	(__TGMATH_BINARY_REAL_STD_ONLY): Likewise.
	(__TGMATH_BINARY_REAL_RET_ONLY): Likewise.
	(__TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY): Likewise.
	(__TGMATH_TERNARY_REAL_ONLY): Likewise.
	(__TGMATH_BINARY_REAL_IMAG): Likewise.
	* math/gen-tgmath-tests.py (Type.init_types): Create __int128 and
	unsigned __int128 types.
Diffstat (limited to 'math/tgmath.h')
-rw-r--r--math/tgmath.h20
1 files changed, 7 insertions, 13 deletions
diff --git a/math/tgmath.h b/math/tgmath.h
index 211948c2e4..019f072e3e 100644
--- a/math/tgmath.h
+++ b/math/tgmath.h
@@ -129,8 +129,7 @@
 		     : (__tgmath_real_type (Val1)) __tgml(Fct) (Val1, Val2)))
 
 # define __TGMATH_BINARY_REAL_ONLY(Val1, Val2, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)		      \
-		       || sizeof (+(Val2)) > sizeof (double))		      \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)	      \
 		      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
 		     ? __TGMATH_F128 ((Val1) + (Val2),			      \
 				      (__typeof				      \
@@ -152,8 +151,7 @@
 		       Fct##f (Val1, Val2)))
 
 # define __TGMATH_BINARY_REAL_STD_ONLY(Val1, Val2, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)		      \
-		       || sizeof (+(Val2)) > sizeof (double))		      \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)	      \
 		      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
 		     ? (__typeof ((__tgmath_real_type (Val1)) 0		      \
 				  + (__tgmath_real_type (Val2)) 0))	      \
@@ -170,8 +168,7 @@
 		       Fct##f (Val1, Val2)))
 
 # define __TGMATH_BINARY_REAL_RET_ONLY(Val1, Val2, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)		      \
-		       || sizeof (+(Val2)) > sizeof (double))		      \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)	      \
 		      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
 		     ? __TGMATH_F128 ((Val1) + (Val2), Fct, (Val1, Val2))     \
 		     __tgml(Fct) (Val1, Val2)				      \
@@ -183,8 +180,7 @@
 		     : Fct##f (Val1, Val2)))
 
 # define __TGMATH_TERNARY_FIRST_SECOND_REAL_ONLY(Val1, Val2, Val3, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)		      \
-		       || sizeof (+(Val2)) > sizeof (double))		      \
+     (__extension__ ((sizeof ((Val1) + (Val2)) > sizeof (double)	      \
 		      && __builtin_classify_type ((Val1) + (Val2)) == 8)      \
 		     ? __TGMATH_F128 ((Val1) + (Val2),			      \
 				      (__typeof				      \
@@ -206,9 +202,7 @@
 		       Fct##f (Val1, Val2, Val3)))
 
 # define __TGMATH_TERNARY_REAL_ONLY(Val1, Val2, Val3, Fct) \
-     (__extension__ (((sizeof (+(Val1)) > sizeof (double)		      \
-		       || sizeof (+(Val2)) > sizeof (double)		      \
-		       || sizeof (+(Val3)) > sizeof (double))		      \
+     (__extension__ ((sizeof ((Val1) + (Val2) + (Val3)) > sizeof (double)     \
 		      && __builtin_classify_type ((Val1) + (Val2) + (Val3))   \
 			 == 8)						      \
 		     ? __TGMATH_F128 ((Val1) + (Val2) + (Val3),		      \
@@ -312,8 +306,8 @@
 /* XXX This definition has to be changed as soon as the compiler understands
    the imaginary keyword.  */
 # define __TGMATH_BINARY_REAL_IMAG(Val1, Val2, Fct, Cfct) \
-     (__extension__ (((sizeof (+__real__ (Val1)) > sizeof (double)	      \
-		       || sizeof (+__real__ (Val2)) > sizeof (double))	      \
+     (__extension__ ((sizeof (__real__ (Val1)				      \
+			      + __real__ (Val2)) > sizeof (double)	      \
 		      && __builtin_classify_type (__real__ (Val1)	      \
 						  + __real__ (Val2)) == 8)    \
 		     ? __TGMATH_CF128 ((Val1) + (Val2),			      \