changeset 11224:5aa57cee93aa

avoid gcc 3.4.3 bug on long double NaN on Irix 6.5 * tests/nan.h (NaNl): Rewrite as function on Irix, to avoid compilation bug by using runtime conversion. * m4/isfinite.m4 (gl_ISFINITE): Likewise. * m4/isnanl.m4 (gl_FUNC_ISNANL): Likewise. * modules/ceill-tests (Files): Use nan.h. * modules/floorl-tests (Files): Likewise. * modules/frexpl-tests (Files): Likewise. * modules/isnanl-tests (Files): Likewise. * modules/ldexpl-tests (Files): Likewise. * modules/roundl-tests (Files): Likewise. * modules/truncl-tests (Files): Likewise. * tests/test-ceill.c (main): Use a working NaN. * tests/test-floorl.c (main): Likewise. * tests/test-frexpl.c (main): Likewise. * tests/test-isnan.c (test_long_double): Likewise. * tests/test-isnanl.h (main): Likewise. * tests/test-ldexpl.h (main): Likewise. * tests/test-roundl.h (main): Likewise. * tests/test-truncl.h (main): Likewise. See http://lists.gnu.org/archive/html/bug-gnulib/2009-02/msg00190.html. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Thu, 26 Feb 2009 20:18:42 -0700
parents 41012a39667b
children 24c0bc8164ae
files ChangeLog m4/isfinite.m4 m4/isnanl.m4 modules/ceill-tests modules/floorl-tests modules/frexpl-tests modules/isnanl-tests modules/ldexpl-tests modules/roundl-tests modules/truncl-tests tests/nan.h tests/test-ceill.c tests/test-floorl.c tests/test-frexpl.c tests/test-isnan.c tests/test-isnanl.h tests/test-ldexpl.c tests/test-roundl.c tests/test-truncl.c
diffstat 19 files changed, 89 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Feb 27 02:14:00 2009 +0100
+++ b/ChangeLog	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,29 @@
 2009-02-26  Eric Blake  <ebb9@byu.net>
-            Bruno Haible  <bruno@clisp.org>
+
+	avoid gcc 3.4.3 bug on long double NaN on Irix 6.5
+	* tests/nan.h (NaNl): Rewrite as function on Irix, to avoid
+	compilation bug by using runtime conversion.
+	* m4/isfinite.m4 (gl_ISFINITE): Likewise.
+	* m4/isnanl.m4 (gl_FUNC_ISNANL): Likewise.
+	* modules/ceill-tests (Files): Use nan.h.
+	* modules/floorl-tests (Files): Likewise.
+	* modules/frexpl-tests (Files): Likewise.
+	* modules/isnanl-tests (Files): Likewise.
+	* modules/ldexpl-tests (Files): Likewise.
+	* modules/roundl-tests (Files): Likewise.
+	* modules/truncl-tests (Files): Likewise.
+	* tests/test-ceill.c (main): Use a working NaN.
+	* tests/test-floorl.c (main): Likewise.
+	* tests/test-frexpl.c (main): Likewise.
+	* tests/test-isnan.c (test_long_double): Likewise.
+	* tests/test-isnanl.h (main): Likewise.
+	* tests/test-ldexpl.h (main): Likewise.
+	* tests/test-roundl.h (main): Likewise.
+	* tests/test-truncl.h (main): Likewise.
+	See http://lists.gnu.org/archive/html/bug-gnulib/2009-02/msg00190.html.
+
+2009-02-26  Eric Blake  <ebb9@byu.net>
+           Bruno Haible  <bruno@clisp.org>
 
 	Work around a *printf bug with %ls on Solaris.
 	* m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): Also test whether, when a
--- a/m4/isfinite.m4	Fri Feb 27 02:14:00 2009 +0100
+++ b/m4/isfinite.m4	Thu Feb 26 20:18:42 2009 -0700
@@ -1,4 +1,4 @@
-# isfinite.m4 serial 4
+# isfinite.m4 serial 5
 dnl Copyright (C) 2007-2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -56,6 +56,17 @@
   ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 typedef union { unsigned int word[NWORDS]; long double value; }
         memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+   runtime type conversion.  */
+#ifdef __sgi
+static long double NaNl ()
+{
+  double zero = 0.0;
+  return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
 int main ()
 {
   memory_long_double m;
@@ -65,7 +76,7 @@
      in the mantissa bits.  The xor operation twiddles a bit that can only be
      a sign bit or a mantissa bit (since the exponent never extends to
      bit 31).  */
-  m.value = 0.0L / 0.0L;
+  m.value = NaNl ();
   m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
   for (i = 0; i < NWORDS; i++)
     m.word[i] |= 1;
--- a/m4/isnanl.m4	Fri Feb 27 02:14:00 2009 +0100
+++ b/m4/isnanl.m4	Thu Feb 26 20:18:42 2009 -0700
@@ -1,4 +1,4 @@
-# isnanl.m4 serial 11
+# isnanl.m4 serial 12
 dnl Copyright (C) 2007-2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -133,20 +133,30 @@
   ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
 typedef union { unsigned int word[NWORDS]; long double value; }
         memory_long_double;
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+   runtime type conversion.  */
+#ifdef __sgi
+static long double NaNl ()
+{
+  double zero = 0.0;
+  return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
 int main ()
 {
   memory_long_double m;
   unsigned int i;
 
-  /* gcc-3.4.3 on IRIX 6.5 appears to have a problem with this.  */
-  if (!isnanl (0.0L / 0.0L))
+  if (!isnanl (NaNl ()))
     return 1;
 
   /* The isnanl function should be immune against changes in the sign bit and
      in the mantissa bits.  The xor operation twiddles a bit that can only be
      a sign bit or a mantissa bit (since the exponent never extends to
      bit 31).  */
-  m.value = 0.0L / 0.0L;
+  m.value = NaNl ();
   m.word[NWORDS / 2] ^= (unsigned int) 1 << (sizeof (unsigned int) * CHAR_BIT - 1);
   for (i = 0; i < NWORDS; i++)
     m.word[i] |= 1;
--- a/modules/ceill-tests	Fri Feb 27 02:14:00 2009 +0100
+++ b/modules/ceill-tests	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,6 @@
 Files:
 tests/test-ceill.c
+tests/nan.h
 
 Depends-on:
 fpucw
--- a/modules/floorl-tests	Fri Feb 27 02:14:00 2009 +0100
+++ b/modules/floorl-tests	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,6 @@
 Files:
 tests/test-floorl.c
+tests/nan.h
 
 Depends-on:
 fpucw
--- a/modules/frexpl-tests	Fri Feb 27 02:14:00 2009 +0100
+++ b/modules/frexpl-tests	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,6 @@
 Files:
 tests/test-frexpl.c
+tests/nan.h
 
 Depends-on:
 fpucw
--- a/modules/isnanl-tests	Fri Feb 27 02:14:00 2009 +0100
+++ b/modules/isnanl-tests	Thu Feb 26 20:18:42 2009 -0700
@@ -1,6 +1,7 @@
 Files:
 tests/test-isnanl.c
 tests/test-isnanl.h
+tests/nan.h
 
 Depends-on:
 float
--- a/modules/ldexpl-tests	Fri Feb 27 02:14:00 2009 +0100
+++ b/modules/ldexpl-tests	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,6 @@
 Files:
 tests/test-ldexpl.c
+tests/nan.h
 
 Depends-on:
 fpucw
--- a/modules/roundl-tests	Fri Feb 27 02:14:00 2009 +0100
+++ b/modules/roundl-tests	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,6 @@
 Files:
 tests/test-roundl.c
+tests/nan.h
 
 Depends-on:
 fpucw
--- a/modules/truncl-tests	Fri Feb 27 02:14:00 2009 +0100
+++ b/modules/truncl-tests	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,6 @@
 Files:
 tests/test-truncl.c
+tests/nan.h
 
 Depends-on:
 fpucw
--- a/tests/nan.h	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/nan.h	Thu Feb 26 20:18:42 2009 -0700
@@ -1,5 +1,5 @@
 /* Macros for not-a-number.
-   Copyright (C) 2007-2008 Free Software Foundation, Inc.
+   Copyright (C) 2007-2009 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -47,4 +47,14 @@
 
 /* NaNl () returns a 'long double' not-a-number.  */
 
-#define NaNl() (0.0L / 0.0L)
+/* On Irix 6.5, gcc 3.4.3 can't compute compile-time NaN, and needs the
+   runtime type conversion.  */
+#ifdef __sgi
+static long double NaNl ()
+{
+  double zero = 0.0;
+  return zero / zero;
+}
+#else
+# define NaNl() (0.0L / 0.0L)
+#endif
--- a/tests/test-ceill.c	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-ceill.c	Thu Feb 26 20:18:42 2009 -0700
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do									     \
@@ -90,7 +91,7 @@
   ASSERT (ceill (1.0L / 0.0L) == 1.0L / 0.0L);
   ASSERT (ceill (-1.0L / 0.0L) == -1.0L / 0.0L);
   /* NaNs.  */
-  ASSERT (isnanl (ceill (0.0L / 0.0L)));
+  ASSERT (isnanl (ceill (NaNl ())));
 
   return 0;
 }
--- a/tests/test-floorl.c	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-floorl.c	Thu Feb 26 20:18:42 2009 -0700
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do									     \
@@ -90,7 +91,7 @@
   ASSERT (floorl (1.0L / 0.0L) == 1.0L / 0.0L);
   ASSERT (floorl (-1.0L / 0.0L) == -1.0L / 0.0L);
   /* NaNs.  */
-  ASSERT (isnanl (floorl (0.0L / 0.0L)));
+  ASSERT (isnanl (floorl (NaNl ())));
 
   return 0;
 }
--- a/tests/test-frexpl.c	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-frexpl.c	Thu Feb 26 20:18:42 2009 -0700
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 /* Avoid some warnings from "gcc -Wshadow".
    This file doesn't use the exp() function.  */
@@ -95,7 +96,7 @@
   { /* NaN.  */
     int exp = -9999;
     long double mantissa;
-    x = 0.0L / 0.0L;
+    x = NaNl ();
     mantissa = frexpl (x, &exp);
     ASSERT (isnanl (mantissa));
   }
--- a/tests/test-isnan.c	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-isnan.c	Thu Feb 26 20:18:42 2009 -0700
@@ -163,14 +163,14 @@
   ASSERT (!isnan (1.0L / 0.0L));
   ASSERT (!isnan (-1.0L / 0.0L));
   /* Quiet NaN.  */
-  ASSERT (isnan (0.0L / 0.0L));
+  ASSERT (isnan (NaNl ()));
 
 #if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
   /* A bit pattern that is different from a Quiet NaN.  With a bit of luck,
      it's a Signalling NaN.  */
   {
     memory_long_double m;
-    m.value = 0.0L / 0.0L;
+    m.value = NaNl ();
 # if LDBL_EXPBIT0_BIT > 0
     m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
 # else
--- a/tests/test-isnanl.h	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-isnanl.h	Thu Feb 26 20:18:42 2009 -0700
@@ -21,6 +21,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "nan.h"
+
 #define ASSERT(expr) \
   do									     \
     {									     \
@@ -70,14 +72,14 @@
   ASSERT (!isnanl (1.0L / 0.0L));
   ASSERT (!isnanl (-1.0L / 0.0L));
   /* Quiet NaN.  */
-  ASSERT (isnanl (0.0L / 0.0L));
+  ASSERT (isnanl (NaNl ()));
 
 #if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
   /* A bit pattern that is different from a Quiet NaN.  With a bit of luck,
      it's a Signalling NaN.  */
   {
     memory_long_double m;
-    m.value = 0.0L / 0.0L;
+    m.value = NaNl ();
 # if LDBL_EXPBIT0_BIT > 0
     m.word[LDBL_EXPBIT0_WORD] ^= (unsigned int) 1 << (LDBL_EXPBIT0_BIT - 1);
 # else
--- a/tests/test-ldexpl.c	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-ldexpl.c	Thu Feb 26 20:18:42 2009 -0700
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do									     \
@@ -66,7 +67,7 @@
   BEGIN_LONG_DOUBLE_ROUNDING ();
 
   { /* NaN.  */
-    x = 0.0L / 0.0L;
+    x = NaNl ();
     y = ldexpl (x, 0); ASSERT (isnanl (y));
     y = ldexpl (x, 5); ASSERT (isnanl (y));
     y = ldexpl (x, -5); ASSERT (isnanl (y));
--- a/tests/test-roundl.c	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-roundl.c	Thu Feb 26 20:18:42 2009 -0700
@@ -28,6 +28,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do									     \
@@ -97,7 +98,7 @@
   ASSERT (roundl (1.0 / 0.0L) == 1.0 / 0.0L);
   ASSERT (roundl (-1.0 / 0.0L) == -1.0 / 0.0L);
   /* NaNs.  */
-  ASSERT (isnanl (roundl (0.0L / 0.0L)));
+  ASSERT (isnanl (roundl (NaNl ())));
 
   return 0;
 }
--- a/tests/test-truncl.c	Fri Feb 27 02:14:00 2009 +0100
+++ b/tests/test-truncl.c	Thu Feb 26 20:18:42 2009 -0700
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do									     \
@@ -89,7 +90,7 @@
   ASSERT (truncl (1.0L / 0.0L) == 1.0L / 0.0L);
   ASSERT (truncl (-1.0L / 0.0L) == -1.0L / 0.0L);
   /* NaNs.  */
-  ASSERT (isnanl (truncl (0.0L / 0.0L)));
+  ASSERT (isnanl (truncl (NaNl ())));
 
   return 0;
 }