changeset 9929:357b15084942

Adjust strtod detection to catch glibc 2.7 bug. * m4/strtod.m4 (gl_FUNC_STRTOD): Test "nan()" behavior. Reported by BuraphaLinux Server. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Wed, 16 Apr 2008 19:28:29 -0600
parents 9a02133ad731
children 3f183c950e56
files ChangeLog m4/strtod.m4
diffstat 2 files changed, 23 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-04-16  Eric Blake  <ebb9@byu.net>
+
+	Adjust strtod detection to catch glibc 2.7 bug.
+	* m4/strtod.m4 (gl_FUNC_STRTOD): Test "nan()" behavior.
+	Reported by BuraphaLinux Server.
+
 2008-04-16  Bruno Haible  <bruno@clisp.org>
 
 	Add tentative support for Linux libc5.
--- a/m4/strtod.m4
+++ b/m4/strtod.m4
@@ -1,4 +1,4 @@
-# strtod.m4 serial 8
+# strtod.m4 serial 9
 dnl Copyright (C) 2002, 2003, 2006, 2007, 2008 Free Software
 dnl Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
@@ -19,6 +19,14 @@
       [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
 #include <stdlib.h>
 #include <math.h>
+/* Compare two numbers with ==.
+   This is a separate function because IRIX 6.5 "cc -O" miscompiles an
+   'x == x' test.  */
+static int
+numeric_equal (double x, double y)
+{
+  return x == y;
+}
 ]], [[
   {
     /* Older glibc and Cygwin mis-parse "-0x".  */
@@ -45,6 +53,14 @@
     if (value != HUGE_VAL || term != (string + 3))
       return 1;
   }
+  {
+    /* glibc 2.7 and cygwin 1.5.24 misparse "nan()".  */
+    const char *string = "nan()";
+    char *term;
+    double value = strtod (string, &term);
+    if (numeric_equal (value, value) || term != (string + 5))
+      return 1;
+  }
 ]])],
 	[gl_cv_func_strtod_works=yes],
 	[gl_cv_func_strtod_works=no],