changeset 16602:549120e12a45

roundl: Don't override undeclared system function on IRIX 6.5. * m4/roundl.m4 (gl_FUNC_ROUNDL): Search for roundl() in the libraries also when it is not declared. Set HAVE_ROUNDL. For replacement code, test HAVE_ROUNDL, not HAVE_DECL_ROUNDL. * modules/roundl (configure.ac): For replacement code, test HAVE_ROUNDL, not HAVE_DECL_ROUNDL. (Depends-on): Update conditions. * doc/posix-functions/roundl.texi: Mention the IRIX problem.
author Bruno Haible <bruno@clisp.org>
date Thu, 08 Mar 2012 02:06:10 +0100
parents 3846767a473f
children f57d6aac15ce
files ChangeLog doc/posix-functions/roundl.texi m4/roundl.m4 modules/roundl
diffstat 4 files changed, 37 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2012-03-07  Bruno Haible  <bruno@clisp.org>
+
+	roundl: Don't override undeclared system function on IRIX 6.5.
+	* m4/roundl.m4 (gl_FUNC_ROUNDL): Search for roundl() in the libraries
+	also when it is not declared. Set HAVE_ROUNDL. For replacement code,
+	test HAVE_ROUNDL, not HAVE_DECL_ROUNDL.
+	* modules/roundl (configure.ac): For replacement code, test
+	HAVE_ROUNDL, not HAVE_DECL_ROUNDL.
+	(Depends-on): Update conditions.
+	* doc/posix-functions/roundl.texi: Mention the IRIX problem.
+
 2012-03-07  Bruno Haible  <bruno@clisp.org>
 
 	roundf: Don't override undeclared system function on IRIX 6.5.
--- a/doc/posix-functions/roundl.texi
+++ b/doc/posix-functions/roundl.texi
@@ -10,10 +10,10 @@
 @itemize
 @item
 This function is missing on some platforms:
-FreeBSD 5.2.1, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, MSVC 9, Interix 3.5, BeOS.
+FreeBSD 5.2.1, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, older IRIX 6.5, OSF/1 4.0, Solaris 9, Cygwin, MSVC 9, Interix 3.5, BeOS.
 @item
 This function is not declared on some platforms:
-glibc 2.8, OSF/1 5.1.
+glibc 2.8, IRIX 6.5, OSF/1 5.1.
 @end itemize
 
 Portability problems fixed by Gnulib module @code{roundl-ieee}:
--- a/m4/roundl.m4
+++ b/m4/roundl.m4
@@ -1,4 +1,4 @@
-# roundl.m4 serial 13
+# roundl.m4 serial 14
 dnl Copyright (C) 2007, 2009-2012 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -13,12 +13,19 @@
   dnl Persuade glibc <math.h> to declare roundl().
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
-  AC_CHECK_DECLS([roundl], , , [[#include <math.h>]])
-  if test "$ac_cv_have_decl_roundl" = yes; then
-    gl_CHECK_MATH_LIB([ROUNDL_LIBM], [x = roundl (x);])
-    if test "$ROUNDL_LIBM" = missing; then
-      REPLACE_ROUNDL=1
-    fi
+  gl_CHECK_MATH_LIB([ROUNDL_LIBM], [x = roundl (x);],
+    [extern
+     #ifdef __cplusplus
+     "C"
+     #endif
+     long double roundl (long double);
+    ])
+  if test "$ROUNDL_LIBM" != missing; then
+    HAVE_ROUNDL=1
+    dnl Also check whether it's declared.
+    dnl IRIX 6.5 has roundl() in libm but doesn't declare it in <math.h>.
+    AC_CHECK_DECLS([roundl], , [HAVE_DECL_ROUNDL=0], [[#include <math.h>]])
+
     m4_ifdef([gl_FUNC_ROUNDL_IEEE], [
       if test $gl_roundl_required = ieee && test $REPLACE_ROUNDL = 0; then
         AC_CACHE_CHECK([whether roundl works according to ISO C 99 with IEC 60559],
@@ -32,6 +39,11 @@
 # define __NO_MATH_INLINES 1 /* for glibc */
 #endif
 #include <math.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+long double roundl (long double);
 ]gl_LONG_DOUBLE_MINUS_ZERO_CODE[
 ]gl_LONG_DOUBLE_SIGNBIT_CODE[
 static long double dummy (long double f) { return 0; }
@@ -60,9 +72,10 @@
       fi
     ])
   else
+    HAVE_ROUNDL=0
     HAVE_DECL_ROUNDL=0
   fi
-  if test $HAVE_DECL_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; then
+  if test $HAVE_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; then
     dnl Find libraries needed to link lib/roundl.c.
     if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then
       AC_REQUIRE([gl_FUNC_ROUND])
--- a/modules/roundl
+++ b/modules/roundl
@@ -12,12 +12,12 @@
 Depends-on:
 math
 extensions
-round           [{ test $HAVE_DECL_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1]
-float           [{ test $HAVE_DECL_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
+round           [{ test $HAVE_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1]
+float           [{ test $HAVE_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 0]
 
 configure.ac:
 gl_FUNC_ROUNDL
-if test $HAVE_DECL_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; then
+if test $HAVE_ROUNDL = 0 || test $REPLACE_ROUNDL = 1; then
   AC_LIBOBJ([roundl])
 fi
 gl_MATH_MODULE_INDICATOR([roundl])