frexpl(Infinity) on IRIX 6.5 does not return Infinity, as it should according to POSIX/MX. I'm adding a configure check against it:
2007-03-25 Bruno Haible <[EMAIL PROTECTED]> * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): New macro. (gl_FUNC_FREXPL): Invoke it. Set REPLACE_FREXPL to 1 if it frexpl exists but doesn't work. * lib/math_.h (frexpl): Define as a replacement macro if REPLACE_FREXPL is set. Don't provide a prototype if REPLACE_FREXPL is not set. * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_FREXPL. * modules/math (Makefile.am) Substibute also REPLACE_FREXPL into math.h. *** m4/frexpl.m4 23 Mar 2007 01:26:24 -0000 1.1 --- m4/frexpl.m4 25 Mar 2007 21:26:37 -0000 *************** *** 1,4 **** ! # frexpl.m4 serial 1 dnl Copyright (C) 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, --- 1,4 ---- ! # frexpl.m4 serial 2 dnl Copyright (C) 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, *************** *** 36,41 **** --- 36,53 ---- fi if test $gl_cv_func_frexpl_no_libm = yes \ || test $gl_cv_func_frexpl_in_libm = yes; then + save_LIBS="$LIBS" + LIBS="$LIBS $FREXPL_LIBM" + gl_FUNC_FREXPL_WORKS + LIBS="$save_LIBS" + case "$gl_cv_func_frexpl_works" in + *yes) gl_func_frexpl=yes ;; + *) gl_func_frexpl=no; REPLACE_FREXPL=1; FREXPL_LIBM= ;; + esac + else + gl_func_frexpl=no + fi + if test $gl_func_frexpl = yes; then AC_DEFINE([HAVE_FREXPL], 1, [Define if the frexpl() function is available.]) dnl Also check whether it's declared. *************** *** 45,47 **** --- 57,90 ---- AC_LIBOBJ([frexpl]) fi ]) + + dnl Test whether frexpl() works also on infinite numbers (this fails e.g. on + dnl IRIX 6.5). + AC_DEFUN([gl_FUNC_FREXPL_WORKS], + [ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works], + [ + AC_TRY_RUN([ + #include <math.h> + int main() + { + volatile long double x; + /* Test on infinite numbers. */ + { + x = 1.0L / 0.0L; + int exp; + long double y = frexpl (x, &exp); + if (y != x) + return 1; + } + return 0; + }], [gl_cv_func_frexpl_works=yes], [gl_cv_func_frexpl_works=no], + [case "$host_os" in + irix*) gl_cv_func_frexpl_works="guessing no";; + *) gl_cv_func_frexpl_works="guessing yes";; + esac + ]) + ]) + ]) *** m4/math_h.m4 23 Mar 2007 01:26:24 -0000 1.4 --- m4/math_h.m4 25 Mar 2007 21:26:37 -0000 *************** *** 39,42 **** --- 39,43 ---- HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL]) HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL]) REPLACE_FREXP=0; AC_SUBST([REPLACE_FREXP]) + REPLACE_FREXPL=0; AC_SUBST([REPLACE_FREXPL]) ]) *** lib/math_.h 23 Mar 2007 03:06:51 -0000 1.6 --- lib/math_.h 25 Mar 2007 21:26:37 -0000 *************** *** 135,141 **** If x is zero: mantissa = x, exp = 0. If x is infinite or NaN: mantissa = x, exp unspecified. Store exp and return mantissa. */ ! #if @GNULIB_FREXPL@ || [EMAIL PROTECTED]@ extern long double frexpl (long double x, int *exp); #endif #if [EMAIL PROTECTED]@ && defined GNULIB_POSIXCHECK --- 135,144 ---- If x is zero: mantissa = x, exp = 0. If x is infinite or NaN: mantissa = x, exp unspecified. Store exp and return mantissa. */ ! #if @GNULIB_FREXPL@ && @REPLACE_FREXPL@ ! # define frexpl rpl_frexpl ! #endif ! #if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || [EMAIL PROTECTED]@ extern long double frexpl (long double x, int *exp); #endif #if [EMAIL PROTECTED]@ && defined GNULIB_POSIXCHECK *** modules/math 23 Mar 2007 01:26:24 -0000 1.4 --- modules/math 25 Mar 2007 21:26:37 -0000 *************** *** 38,43 **** --- 38,44 ---- -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \ -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \ -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \ + -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ < $(srcdir)/math_.h; \ } > [EMAIL PROTECTED]