From c0ea2abaac8565cdf5331b43e1608df1f43f415f Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 8 Mar 2012 01:26:03 +0100 Subject: [PATCH] round: Don't override undeclared system function on IRIX 6.5. * m4/check-math-lib.m4 (gl_CHECK_MATH_LIB): Accept an optional third argument. * m4/round.m4 (gl_FUNC_ROUND): Search for round() in the libraries also when it is not declared. Set HAVE_ROUND. For replacement code, test HAVE_ROUND, not HAVE_DECL_ROUND. * modules/round (configure.ac): For replacement code, test HAVE_ROUND, not HAVE_DECL_ROUND. (Depends-on): Update conditions. * modules/round-ieee (Depends-on): Update conditions. * doc/posix-functions/round.texi: Mention the IRIX problem. --- ChangeLog | 14 ++++++++ doc/posix-functions/round.texi | 4 +-- m4/check-math-lib.m4 | 5 +-- m4/round.m4 | 75 ++++++++++++++++++++++++++---------------- modules/round | 6 ++-- modules/round-ieee | 4 +-- 6 files changed, 71 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index d49552ddf..faec45bb2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2012-03-07 Bruno Haible + round: Don't override undeclared system function on IRIX 6.5. + * m4/check-math-lib.m4 (gl_CHECK_MATH_LIB): Accept an optional third + argument. + * m4/round.m4 (gl_FUNC_ROUND): Search for round() in the libraries + also when it is not declared. Set HAVE_ROUND. For replacement code, + test HAVE_ROUND, not HAVE_DECL_ROUND. + * modules/round (configure.ac): For replacement code, test HAVE_ROUND, + not HAVE_DECL_ROUND. + (Depends-on): Update conditions. + * modules/round-ieee (Depends-on): Update conditions. + * doc/posix-functions/round.texi: Mention the IRIX problem. + +2012-03-07 Bruno Haible + copysignf: Don't override undeclared system function on IRIX 6.5. * lib/math.in.h (copysignf): Test HAVE_DECL_COPYSIGNF, not HAVE_COPYSIGNF. diff --git a/doc/posix-functions/round.texi b/doc/posix-functions/round.texi index ca95e1893..6eaa5e708 100644 --- a/doc/posix-functions/round.texi +++ b/doc/posix-functions/round.texi @@ -10,10 +10,10 @@ Portability problems fixed by either Gnulib module @code{round} or @code{round-i @itemize @item This function is missing on some platforms: -FreeBSD 5.2.1, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, IRIX 6.5, OSF/1 4.0, Solaris 9, MSVC 9, Interix 3.5. +FreeBSD 5.2.1, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, older IRIX 6.5, OSF/1 4.0, Solaris 9, MSVC 9, Interix 3.5. @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. @item This functions returns a wrong result for x = 1/2 - 2^-54 on some platforms: NetBSD 3.0, AIX 7.1. diff --git a/m4/check-math-lib.m4 b/m4/check-math-lib.m4 index 0b77d8f6a..4f370eb49 100644 --- a/m4/check-math-lib.m4 +++ b/m4/check-math-lib.m4 @@ -1,10 +1,10 @@ -# check-math-lib.m4 serial 3 +# check-math-lib.m4 serial 4 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, dnl with or without modifications, as long as this notice is preserved. dnl -dnl gl_CHECK_MATH_LIB (VARIABLE, EXPRESSION) +dnl gl_CHECK_MATH_LIB (VARIABLE, EXPRESSION [, EXTRA-CODE]) dnl dnl Sets the shell VARIABLE according to the libraries needed by EXPRESSION dnl to compile and link: to the empty string if no extra libraries are needed, @@ -22,6 +22,7 @@ AC_DEFUN([gl_CHECK_MATH_LIB], [ # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include + $3 double x;]], [$2])], [$1=$libm diff --git a/m4/round.m4 b/m4/round.m4 index e2acf9366..805eba9d5 100644 --- a/m4/round.m4 +++ b/m4/round.m4 @@ -1,4 +1,4 @@ -# round.m4 serial 14 +# round.m4 serial 15 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, @@ -8,23 +8,39 @@ AC_DEFUN([gl_FUNC_ROUND], [ m4_divert_text([DEFAULTS], [gl_round_required=plain]) AC_REQUIRE([gl_MATH_H_DEFAULTS]) + dnl Persuade glibc to declare round(). AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) - AC_CHECK_DECLS([round], , , [[#include ]]) - if test "$ac_cv_have_decl_round" = yes; then - gl_CHECK_MATH_LIB([ROUND_LIBM], [x = round (x);]) - if test "$ROUND_LIBM" != missing; then - dnl Test whether round() produces correct results. On NetBSD 3.0, for - dnl x = 1/2 - 2^-54, the system's round() returns a wrong result. - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles - AC_CACHE_CHECK([whether round works], [gl_cv_func_round_works], - [ - save_LIBS="$LIBS" - LIBS="$LIBS $ROUND_LIBM" - AC_RUN_IFELSE([AC_LANG_SOURCE([[ + + gl_CHECK_MATH_LIB([ROUND_LIBM], [x = round (x);], + [extern + #ifdef __cplusplus + "C" + #endif + double round (double); + ]) + if test "$ROUND_LIBM" != missing; then + HAVE_ROUND=1 + dnl Also check whether it's declared. + dnl IRIX 6.5 has round() in libm but doesn't declare it in . + AC_CHECK_DECLS([round], , [HAVE_DECL_ROUND=0], [[#include ]]) + + dnl Test whether round() produces correct results. On NetBSD 3.0, for + dnl x = 1/2 - 2^-54, the system's round() returns a wrong result. + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether round works], [gl_cv_func_round_works], + [ + save_LIBS="$LIBS" + LIBS="$LIBS $ROUND_LIBM" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include +extern +#ifdef __cplusplus +"C" +#endif +double round (double); #ifdef _MSC_VER # pragma fenv_access (off) #endif @@ -43,20 +59,17 @@ int main() volatile double x = 0.5 - 0.5 / TWO_MANT_DIG; exit (x < 0.5 && round (x) != 0.0); }]])], [gl_cv_func_round_works=yes], [gl_cv_func_round_works=no], - [case "$host_os" in - netbsd* | aix*) gl_cv_func_round_works="guessing no";; - *) gl_cv_func_round_works="guessing yes";; - esac - ]) - LIBS="$save_LIBS" + [case "$host_os" in + netbsd* | aix*) gl_cv_func_round_works="guessing no";; + *) gl_cv_func_round_works="guessing yes";; + esac ]) - case "$gl_cv_func_round_works" in - *no) ROUND_LIBM=missing ;; - esac - fi - if test "$ROUND_LIBM" = missing; then - REPLACE_ROUND=1 - fi + LIBS="$save_LIBS" + ]) + case "$gl_cv_func_round_works" in + *no) REPLACE_ROUND=1 ;; + esac + m4_ifdef([gl_FUNC_ROUND_IEEE], [ if test $gl_round_required = ieee && test $REPLACE_ROUND = 0; then AC_CACHE_CHECK([whether round works according to ISO C 99 with IEC 60559], @@ -70,6 +83,11 @@ int main() # define __NO_MATH_INLINES 1 /* for glibc */ #endif #include +extern +#ifdef __cplusplus +"C" +#endif +double round (double); ]gl_DOUBLE_MINUS_ZERO_CODE[ ]gl_DOUBLE_SIGNBIT_CODE[ static double dummy (double f) { return 0; } @@ -94,9 +112,10 @@ int main (int argc, char *argv[]) fi ]) else + HAVE_ROUND=0 HAVE_DECL_ROUND=0 fi - if test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1; then + if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then dnl Find libraries needed to link lib/round.c. gl_FUNC_FLOOR_LIBS gl_FUNC_CEIL_LIBS diff --git a/modules/round b/modules/round index 6fe95a23b..c05782222 100644 --- a/modules/round +++ b/modules/round @@ -11,12 +11,12 @@ m4/ceil.m4 Depends-on: math extensions -float [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] -floor [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] +float [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] +floor [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] configure.ac: gl_FUNC_ROUND -if test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1; then +if test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1; then AC_LIBOBJ([round]) fi gl_MATH_MODULE_INDICATOR([round]) diff --git a/modules/round-ieee b/modules/round-ieee index 407e781df..f0f00ffe4 100644 --- a/modules/round-ieee +++ b/modules/round-ieee @@ -8,8 +8,8 @@ m4/signbit.m4 Depends-on: round -floor-ieee [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] -ceil-ieee [test $HAVE_DECL_ROUND = 0 || test $REPLACE_ROUND = 1] +floor-ieee [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] +ceil-ieee [test $HAVE_ROUND = 0 || test $REPLACE_ROUND = 1] configure.ac: gl_FUNC_ROUND_IEEE -- 2.11.0