Mercurial > gnulib
changeset 40116:54732a1c637e
rintl: Override broken implementation on NetBSD.
* lib/math.in.h (rintl): Test also REPLACE_RINTL.
* m4/rintl.m4 (gl_FUNC_RINTL): Add test for negative arguments. Set
REPLACE_RINTL.
* m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_RINTL.
* modules/math (Makefile.in): Substitute REPLACE_RINTL.
* modules/rintl (Depends-on, configure.ac): Test REPLACE_RINTL.
* doc/posix-functions/rintl.texi: Mention the NetBSD bug.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Mon, 21 Jan 2019 00:33:28 +0100 |
parents | d53c98a8c061 |
children | 38d3ab21fe09 |
files | ChangeLog doc/posix-functions/rintl.texi lib/math.in.h m4/math_h.m4 m4/rintl.m4 modules/math modules/rintl |
diffstat | 7 files changed, 85 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Sun Jan 20 23:48:18 2019 +0100 +++ b/ChangeLog Mon Jan 21 00:33:28 2019 +0100 @@ -1,3 +1,14 @@ +2019-01-20 Bruno Haible <bruno@clisp.org> + + rintl: Override broken implementation on NetBSD. + * lib/math.in.h (rintl): Test also REPLACE_RINTL. + * m4/rintl.m4 (gl_FUNC_RINTL): Add test for negative arguments. Set + REPLACE_RINTL. + * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_RINTL. + * modules/math (Makefile.in): Substitute REPLACE_RINTL. + * modules/rintl (Depends-on, configure.ac): Test REPLACE_RINTL. + * doc/posix-functions/rintl.texi: Mention the NetBSD bug. + 2019-01-20 Bruno Haible <bruno@clisp.org> log10l: Work around inaccurate implementation on NetBSD.
--- a/doc/posix-functions/rintl.texi Sun Jan 20 23:48:18 2019 +0100 +++ b/doc/posix-functions/rintl.texi Mon Jan 21 00:33:28 2019 +0100 @@ -11,6 +11,9 @@ @item This function is missing on some platforms: FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, Minix 3.1.8, AIX 5.1, HP-UX 11, IRIX 6.5, Solaris 9, Cygwin 1.5.x, MSVC 9, Interix 3.5, BeOS, Android 4.4. +@item +This function produces wrong results for negative numbers on some platforms: +NetBSD 8.0. @end itemize Portability problems not fixed by Gnulib:
--- a/lib/math.in.h Sun Jan 20 23:48:18 2019 +0100 +++ b/lib/math.in.h Mon Jan 21 00:33:28 2019 +0100 @@ -1845,10 +1845,19 @@ #endif #if @GNULIB_RINTL@ -# if !@HAVE_RINTL@ +# if @REPLACE_RINTL@ +# if !(defined __cplusplus && defined GNULIB_NAMESPACE) +# undef rintl +# define rintl rpl_rintl +# endif +_GL_FUNCDECL_RPL (rintl, long double, (long double x)); +_GL_CXXALIAS_RPL (rintl, long double, (long double x)); +# else +# if !@HAVE_RINTL@ _GL_FUNCDECL_SYS (rintl, long double, (long double x)); +# endif +_GL_CXXALIAS_SYS (rintl, long double, (long double x)); # endif -_GL_CXXALIAS_SYS (rintl, long double, (long double x)); _GL_CXXALIASWARN (rintl); #elif defined GNULIB_POSIXCHECK # undef rintl
--- a/m4/math_h.m4 Sun Jan 20 23:48:18 2019 +0100 +++ b/m4/math_h.m4 Mon Jan 21 00:33:28 2019 +0100 @@ -1,4 +1,4 @@ -# math_h.m4 serial 118 +# math_h.m4 serial 119 dnl Copyright (C) 2007-2019 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -320,6 +320,7 @@ REPLACE_REMAINDER=0; AC_SUBST([REPLACE_REMAINDER]) REPLACE_REMAINDERF=0; AC_SUBST([REPLACE_REMAINDERF]) REPLACE_REMAINDERL=0; AC_SUBST([REPLACE_REMAINDERL]) + REPLACE_RINTL=0; AC_SUBST([REPLACE_RINTL]) REPLACE_ROUND=0; AC_SUBST([REPLACE_ROUND]) REPLACE_ROUNDF=0; AC_SUBST([REPLACE_ROUNDF]) REPLACE_ROUNDL=0; AC_SUBST([REPLACE_ROUNDL])
--- a/m4/rintl.m4 Sun Jan 20 23:48:18 2019 +0100 +++ b/m4/rintl.m4 Mon Jan 21 00:33:28 2019 +0100 @@ -1,4 +1,4 @@ -# rintl.m4 serial 4 +# rintl.m4 serial 5 dnl Copyright (C) 2011-2019 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -14,9 +14,61 @@ dnl Determine RINTL_LIBM. gl_MATHFUNC([rintl], [long double], [(long double)]) - if test $gl_cv_func_rintl_no_libm = no \ - && test $gl_cv_func_rintl_in_libm = no; then + if test $gl_cv_func_rintl_no_libm = yes \ + || test $gl_cv_func_rintl_in_libm = yes; then + if test $REPLACE_RINTL = 0; then + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether rintl works], + [gl_cv_func_rintl_works], + [ + save_LIBS="$LIBS" + LIBS="$LIBS $RINTL_LIBM" + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include <math.h> +#undef rintl +extern +#ifdef __cplusplus +"C" +#endif +long double rintl (long double); +static long double dummy (long double x) { return 0; } +int main (int argc, char *argv[]) +{ + long double (* volatile my_rintl) (long double) = argc ? rintl : dummy; + int result = 0; + /* This test fails on NetBSD 8.0. */ + { + volatile long double x = -0.3L; + long double y = my_rintl (x); + if (!(y == 0.0L)) + result |= 1; + } + return result; +} + ]])], + [gl_cv_func_rintl_works=yes], + [gl_cv_func_rintl_works=no], + [case "$host_os" in + # Guess yes on glibc systems. + *-gnu* | gnu*) gl_cv_func_rintl_works="guessing yes" ;; + # Guess yes on native Windows. + mingw*) gl_cv_func_rintl_works="guessing yes" ;; + # If we don't know, assume the worst. + *) gl_cv_func_rintl_works="guessing no" ;; + esac + ]) + LIBS="$save_LIBS" + ]) + case "$gl_cv_func_rintl_works" in + *yes) ;; + *) REPLACE_RINTL=1 ;; + esac + fi + else HAVE_RINTL=0 + fi + if test $HAVE_RINTL = 0 || test $REPLACE_RINTL = 1; then dnl Find libraries needed to link lib/rintl.c. if test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1; then AC_REQUIRE([gl_FUNC_RINT])
--- a/modules/math Sun Jan 20 23:48:18 2019 +0100 +++ b/modules/math Mon Jan 21 00:33:28 2019 +0100 @@ -290,6 +290,7 @@ -e 's|@''REPLACE_REMAINDER''@|$(REPLACE_REMAINDER)|g' \ -e 's|@''REPLACE_REMAINDERF''@|$(REPLACE_REMAINDERF)|g' \ -e 's|@''REPLACE_REMAINDERL''@|$(REPLACE_REMAINDERL)|g' \ + -e 's|@''REPLACE_RINTL''@|$(REPLACE_RINTL)|g' \ -e 's|@''REPLACE_ROUND''@|$(REPLACE_ROUND)|g' \ -e 's|@''REPLACE_ROUNDF''@|$(REPLACE_ROUNDF)|g' \ -e 's|@''REPLACE_ROUNDL''@|$(REPLACE_ROUNDL)|g' \
--- a/modules/rintl Sun Jan 20 23:48:18 2019 +0100 +++ b/modules/rintl Mon Jan 21 00:33:28 2019 +0100 @@ -10,11 +10,11 @@ Depends-on: math extensions -rint [test $HAVE_RINTL = 0 && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1] +rint [{ test $HAVE_RINTL = 0 || test $REPLACE_RINTL = 1; } && test $HAVE_SAME_LONG_DOUBLE_AS_DOUBLE = 1] configure.ac: gl_FUNC_RINTL -if test $HAVE_RINTL = 0; then +if test $HAVE_RINTL = 0 || test $REPLACE_RINTL = 1; then AC_LIBOBJ([rintl]) fi gl_MATH_MODULE_INDICATOR([rintl])