# HG changeset patch # User Eric Blake # Date 1235704722 25200 # Node ID 5aa57cee93aa5f0b58c60012bc8013943ec8f3d8 # Parent 41012a39667bb897aa8683c32119bee0c3324432 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 diff -r 41012a39667b -r 5aa57cee93aa ChangeLog --- 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 - Bruno Haible + + 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 + Bruno Haible Work around a *printf bug with %ls on Solaris. * m4/printf.m4 (gl_PRINTF_DIRECTIVE_LS): Also test whether, when a diff -r 41012a39667b -r 5aa57cee93aa m4/isfinite.m4 --- 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; diff -r 41012a39667b -r 5aa57cee93aa m4/isnanl.m4 --- 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; diff -r 41012a39667b -r 5aa57cee93aa modules/ceill-tests --- 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 diff -r 41012a39667b -r 5aa57cee93aa modules/floorl-tests --- 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 diff -r 41012a39667b -r 5aa57cee93aa modules/frexpl-tests --- 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 diff -r 41012a39667b -r 5aa57cee93aa modules/isnanl-tests --- 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 diff -r 41012a39667b -r 5aa57cee93aa modules/ldexpl-tests --- 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 diff -r 41012a39667b -r 5aa57cee93aa modules/roundl-tests --- 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 diff -r 41012a39667b -r 5aa57cee93aa modules/truncl-tests --- 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 diff -r 41012a39667b -r 5aa57cee93aa tests/nan.h --- 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 diff -r 41012a39667b -r 5aa57cee93aa tests/test-ceill.c --- 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; } diff -r 41012a39667b -r 5aa57cee93aa tests/test-floorl.c --- 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; } diff -r 41012a39667b -r 5aa57cee93aa tests/test-frexpl.c --- 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)); } diff -r 41012a39667b -r 5aa57cee93aa tests/test-isnan.c --- 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 diff -r 41012a39667b -r 5aa57cee93aa tests/test-isnanl.h --- 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 #include +#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 diff -r 41012a39667b -r 5aa57cee93aa tests/test-ldexpl.c --- 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)); diff -r 41012a39667b -r 5aa57cee93aa tests/test-roundl.c --- 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; } diff -r 41012a39667b -r 5aa57cee93aa tests/test-truncl.c --- 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; }