changeset 14070:ca85283acd03

isfinite: Avoid compiler bug of "cc -O" on HP-UX 11.11. * lib/isfinite.c (zerof, zerod, zerol): New variables. (gl_isfinitef, gl_isfinited, gl_isfinitel): Use them instead of literal zero.
author Bruno Haible <bruno@clisp.org>
date Sat, 01 Jan 2011 03:54:48 +0100
parents 081ce9a593c4
children 24e4d0318ebe
files ChangeLog lib/isfinite.c
diffstat 2 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-12-31  Bruno Haible  <bruno@clisp.org>
+
+	isfinite: Avoid compiler bug of "cc -O" on HP-UX 11.11.
+	* lib/isfinite.c (zerof, zerod, zerol): New variables.
+	(gl_isfinitef, gl_isfinited, gl_isfinitel): Use them instead of literal
+	zero.
+
 2010-12-31  Bruno Haible  <bruno@clisp.org>
 
 	pwrite: Work around HP-UX 11.11 bug.
--- a/lib/isfinite.c
+++ b/lib/isfinite.c
@@ -23,17 +23,30 @@
 #include "isnand-nolibm.h"
 #include "isnanl-nolibm.h"
 
+/* The "cc" compiler on HP-UX 11.11, when optimizing, simplifies the test
+   x - y == 0.0  to  x == y, a simplification which is invalid when x and y
+   are Infinity.  Disable this optimization.  */
+#if defined __hpux && !defined __GNUC__
+static float zerof;
+static double zerod;
+static long double zerol;
+#else
+# define zerof 0.f
+# define zerod 0.
+# define zerol 0.L
+#endif
+
 int gl_isfinitef (float x)
 {
-  return !isnanf (x) && x - x == 0.f;
+  return !isnanf (x) && x - x == zerof;
 }
 
 int gl_isfinited (double x)
 {
-  return !isnand (x) && x - x == 0.;
+  return !isnand (x) && x - x == zerod;
 }
 
 int gl_isfinitel (long double x)
 {
-  return !isnanl (x) && x - x == 0.L;
+  return !isnanl (x) && x - x == zerol;
 }