avoid gcc 3.4.3 bug on long double NaN on Irix 6.5
authorEric Blake <ebb9@byu.net>
Fri, 27 Feb 2009 03:18:42 +0000 (20:18 -0700)
committerEric Blake <ebb9@byu.net>
Fri, 27 Feb 2009 03:50:03 +0000 (20:50 -0700)
* 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>
19 files changed:
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

index 583fa8f..90f91f6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 055ba82..019eb95 100644 (file)
@@ -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 @@ AC_DEFUN([gl_ISFINITEL_WORKS],
   ((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 @@ int main ()
      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;
index fb63ac4..e3029f5 100644 (file)
@@ -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 @@ AC_DEFUN([gl_FUNC_ISNANL_WORKS],
   ((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;
index 381b3a5..ab10141 100644 (file)
@@ -1,5 +1,6 @@
 Files:
 tests/test-ceill.c
+tests/nan.h
 
 Depends-on:
 fpucw
index 7aef91d..ca7c746 100644 (file)
@@ -1,5 +1,6 @@
 Files:
 tests/test-floorl.c
+tests/nan.h
 
 Depends-on:
 fpucw
index 6291f4e..f5505b4 100644 (file)
@@ -1,5 +1,6 @@
 Files:
 tests/test-frexpl.c
+tests/nan.h
 
 Depends-on:
 fpucw
index 7b4086e..518420f 100644 (file)
@@ -1,6 +1,7 @@
 Files:
 tests/test-isnanl.c
 tests/test-isnanl.h
+tests/nan.h
 
 Depends-on:
 float
index 6c88bfd..0b1ba04 100644 (file)
@@ -1,5 +1,6 @@
 Files:
 tests/test-ldexpl.c
+tests/nan.h
 
 Depends-on:
 fpucw
index 8e329a5..442c279 100644 (file)
@@ -1,5 +1,6 @@
 Files:
 tests/test-roundl.c
+tests/nan.h
 
 Depends-on:
 fpucw
index 2365854..7ffc1cd 100644 (file)
@@ -1,5 +1,6 @@
 Files:
 tests/test-truncl.c
+tests/nan.h
 
 Depends-on:
 fpucw
index 3bdf643..8aa8bf0 100644 (file)
@@ -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 @@ NaNd ()
 
 /* 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
index d1f0266..3d4c9e3 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do                                                                        \
@@ -90,7 +91,7 @@ main ()
   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;
 }
index 14979e6..87fea7f 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do                                                                        \
@@ -90,7 +91,7 @@ main ()
   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;
 }
index 2b968b8..d4babb8 100644 (file)
@@ -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 @@ main ()
   { /* NaN.  */
     int exp = -9999;
     long double mantissa;
-    x = 0.0L / 0.0L;
+    x = NaNl ();
     mantissa = frexpl (x, &exp);
     ASSERT (isnanl (mantissa));
   }
index 6149017..9a0856a 100644 (file)
@@ -163,14 +163,14 @@ test_long_double (void)
   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
index 37e2857..baf04db 100644 (file)
@@ -21,6 +21,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "nan.h"
+
 #define ASSERT(expr) \
   do                                                                        \
     {                                                                       \
@@ -70,14 +72,14 @@ main ()
   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
index 395c00f..5f1fbd9 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do                                                                        \
@@ -66,7 +67,7 @@ main ()
   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));
index 51cd1cd..ddbf474 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do                                                                        \
@@ -97,7 +98,7 @@ main ()
   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;
 }
index aad677d..f8ce551 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "fpucw.h"
 #include "isnanl-nolibm.h"
+#include "nan.h"
 
 #define ASSERT(expr) \
   do                                                                        \
@@ -89,7 +90,7 @@ main ()
   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;
 }