changeset 12777:8e7ed08a499b

Fix tests for common <math.h> functions.
author Bruno Haible <bruno@clisp.org>
date Mon, 25 Jan 2010 01:57:08 +0100
parents bebb37f7d22e
children d8673e1077e6
files ChangeLog m4/mathfunc.m4 m4/sqrt.m4 modules/acos modules/asin modules/atan modules/atan2 modules/cbrt modules/copysign modules/cos modules/cosh modules/erf modules/erfc modules/exp modules/fabs modules/fmod modules/hypot modules/j0 modules/j1 modules/jn modules/ldexp modules/lgamma modules/log modules/log10 modules/log1p modules/logb modules/modf modules/nextafter modules/pow modules/remainder modules/rint modules/sin modules/sinh modules/tan modules/tanh modules/y0 modules/y1 modules/yn
diffstat 38 files changed, 95 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,46 @@
+2010-01-24  Bruno Haible  <bruno@clisp.org>
+
+	Fix tests for common <math.h> functions.
+	* m4/mathfunc.m4 (gl_MATHFUNC): Take two additional parameters. Use a
+	code snippet that references the function pointer, rather than merely
+	calling the function. Substitute the FUNC_LIBM variable.
+	* m4/sqrt.m4 (gl_FUNC_SQRT): Update gl_MATHFUNC invocation.
+	* modules/acos (configure.ac): Likewise.
+	* modules/asin (configure.ac): Likewise.
+	* modules/atan (configure.ac): Likewise.
+	* modules/atan2 (configure.ac): Likewise.
+	* modules/cbrt (configure.ac): Likewise.
+	* modules/copysign (configure.ac): Likewise.
+	* modules/cos (configure.ac): Likewise.
+	* modules/cosh (configure.ac): Likewise.
+	* modules/erf (configure.ac): Likewise.
+	* modules/erfc (configure.ac): Likewise.
+	* modules/exp (configure.ac): Likewise.
+	* modules/fabs (configure.ac): Likewise.
+	* modules/fmod (configure.ac): Likewise.
+	* modules/hypot (configure.ac): Likewise.
+	* modules/j0 (configure.ac): Likewise.
+	* modules/j1 (configure.ac): Likewise.
+	* modules/jn (configure.ac): Likewise.
+	* modules/ldexp (configure.ac): Likewise.
+	* modules/lgamma (configure.ac): Likewise.
+	* modules/log (configure.ac): Likewise.
+	* modules/log10 (configure.ac): Likewise.
+	* modules/log1p (configure.ac): Likewise.
+	* modules/logb (configure.ac): Likewise.
+	* modules/modf (configure.ac): Likewise.
+	* modules/nextafter (configure.ac): Likewise.
+	* modules/pow (configure.ac): Likewise.
+	* modules/remainder (configure.ac): Likewise.
+	* modules/rint (configure.ac): Likewise.
+	* modules/sin (configure.ac): Likewise.
+	* modules/sinh (configure.ac): Likewise.
+	* modules/tan (configure.ac): Likewise.
+	* modules/tanh (configure.ac): Likewise.
+	* modules/y0 (configure.ac): Likewise.
+	* modules/y1 (configure.ac): Likewise.
+	* modules/yn (configure.ac): Likewise.
+
 2010-01-24  Bruno Haible  <bruno@clisp.org>
 
 	Tests: Defeat inlining of math functions by GCC >= 4.3.0.
--- a/m4/mathfunc.m4
+++ b/m4/mathfunc.m4
@@ -1,15 +1,21 @@
-# mathfunc.m4 serial 1
+# mathfunc.m4 serial 2
 dnl Copyright (C) 2010 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.
 
-# gl_MATHFUNC([sqrt])
-# tests whether the sqrt function is available in libc or libm. It sets
-# SQRT_LIBM to empty or "-lm" accordingly.
+# gl_MATHFUNC(FUNC, RETTYPE, PARAMTYPES)
+# --------------------------------------------------
+# tests whether the function FUNC is available in libc or libm.
+# RETTYPE is the return type. PARAMTYPES is a parameter list, with parentheses.
+# It sets FUNC_LIBM to empty or "-lm" accordingly.
 
 AC_DEFUN([gl_MATHFUNC],
 [
+  dnl We need the RETTYPE and PARAMTYPES in order to force linking with the
+  dnl function. With gcc >= 4.3 on glibc/x86_64, calls to the 'fabs' function
+  dnl are inlined by the compiler, therefore linking of these calls does not
+  dnl require -lm, but taking the function pointer of 'fabs' does.
   m4_pushdef([func], [$1])
   m4_pushdef([FUNC], [translit([$1],[abcdefghijklmnopqrstuvwxyz],
                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ])])
@@ -22,8 +28,8 @@
                            # define __NO_MATH_INLINES 1 /* for glibc */
                            #endif
                            #include <math.h>
-                           double x;]],
-                         [[return ]func[ (x) > 2 || ]func[ (x) < 0.4;]])],
+                           $2 (*funcptr) $3 = ]func[;]],
+                         [[return 0;]])],
         [gl_cv_func_]func[_no_libm=yes],
         [gl_cv_func_]func[_no_libm=no])
     ])
@@ -38,8 +44,8 @@
                              # define __NO_MATH_INLINES 1 /* for glibc */
                              #endif
                              #include <math.h>
-                             double x;]],
-                           [[return ]func[ (x) > 2 || ]func[ (x) < 0.4;]])],
+                             $2 (*funcptr) $3 = ]func[;]],
+                           [[return 0;]])],
           [gl_cv_func_]func[_in_libm=yes],
           [gl_cv_func_]func[_in_libm=no])
         LIBS="$save_LIBS"
@@ -48,6 +54,7 @@
       FUNC[]_LIBM=-lm
     fi
   fi
+  AC_SUBST(FUNC[_LIBM])
   m4_popdef([FUNC])
   m4_popdef([func])
 ])
--- a/m4/sqrt.m4
+++ b/m4/sqrt.m4
@@ -1,4 +1,4 @@
-# sqrt.m4 serial 1
+# sqrt.m4 serial 2
 dnl Copyright (C) 2010 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -6,5 +6,5 @@
 
 AC_DEFUN([gl_FUNC_SQRT],
 [
-  gl_MATHFUNC([sqrt])
+  gl_MATHFUNC([sqrt], [double], [(double)])
 ])
--- a/modules/acos
+++ b/modules/acos
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([acos])
+gl_MATHFUNC([acos], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/asin
+++ b/modules/asin
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([asin])
+gl_MATHFUNC([asin], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/atan
+++ b/modules/atan
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([atan])
+gl_MATHFUNC([atan], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/atan2
+++ b/modules/atan2
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([atan2])
+gl_MATHFUNC([atan2], [double], [(double, double)])
 
 Makefile.am:
 
--- a/modules/cbrt
+++ b/modules/cbrt
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([cbrt])
+gl_MATHFUNC([cbrt], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/copysign
+++ b/modules/copysign
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([copysign])
+gl_MATHFUNC([copysign], [double], [(double, double)])
 
 Makefile.am:
 
--- a/modules/cos
+++ b/modules/cos
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([cos])
+gl_MATHFUNC([cos], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/cosh
+++ b/modules/cosh
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([cosh])
+gl_MATHFUNC([cosh], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/erf
+++ b/modules/erf
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([erf])
+gl_MATHFUNC([erf], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/erfc
+++ b/modules/erfc
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([erfc])
+gl_MATHFUNC([erfc], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/exp
+++ b/modules/exp
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([exp])
+gl_MATHFUNC([exp], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/fabs
+++ b/modules/fabs
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([fabs])
+gl_MATHFUNC([fabs], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/fmod
+++ b/modules/fmod
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([fmod])
+gl_MATHFUNC([fmod], [double], [(double, double)])
 
 Makefile.am:
 
--- a/modules/hypot
+++ b/modules/hypot
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([hypot])
+gl_MATHFUNC([hypot], [double], [(double, double)])
 
 Makefile.am:
 
--- a/modules/j0
+++ b/modules/j0
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([j0])
+gl_MATHFUNC([j0], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/j1
+++ b/modules/j1
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([j1])
+gl_MATHFUNC([j1], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/jn
+++ b/modules/jn
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([jn])
+gl_MATHFUNC([jn], [double], [(int, double)])
 
 Makefile.am:
 
--- a/modules/ldexp
+++ b/modules/ldexp
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([ldexp])
+gl_MATHFUNC([ldexp], [double], [(double, int)])
 
 Makefile.am:
 
--- a/modules/lgamma
+++ b/modules/lgamma
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([lgamma])
+gl_MATHFUNC([lgamma], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/log
+++ b/modules/log
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([log])
+gl_MATHFUNC([log], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/log10
+++ b/modules/log10
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([log10])
+gl_MATHFUNC([log10], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/log1p
+++ b/modules/log1p
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([log1p])
+gl_MATHFUNC([log1p], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/logb
+++ b/modules/logb
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([logb])
+gl_MATHFUNC([logb], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/modf
+++ b/modules/modf
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([modf])
+gl_MATHFUNC([modf], [double], [(double, double *)])
 
 Makefile.am:
 
--- a/modules/nextafter
+++ b/modules/nextafter
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([nextafter])
+gl_MATHFUNC([nextafter], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/pow
+++ b/modules/pow
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([pow])
+gl_MATHFUNC([pow], [double], [(double, double)])
 
 Makefile.am:
 
--- a/modules/remainder
+++ b/modules/remainder
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([remainder])
+gl_MATHFUNC([remainder], [double], [(double, double)])
 
 Makefile.am:
 
--- a/modules/rint
+++ b/modules/rint
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([rint])
+gl_MATHFUNC([rint], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/sin
+++ b/modules/sin
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([sin])
+gl_MATHFUNC([sin], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/sinh
+++ b/modules/sinh
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([sinh])
+gl_MATHFUNC([sinh], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/tan
+++ b/modules/tan
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([tan])
+gl_MATHFUNC([tan], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/tanh
+++ b/modules/tanh
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([tanh])
+gl_MATHFUNC([tanh], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/y0
+++ b/modules/y0
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([y0])
+gl_MATHFUNC([y0], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/y1
+++ b/modules/y1
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([y1])
+gl_MATHFUNC([y1], [double], [(double)])
 
 Makefile.am:
 
--- a/modules/yn
+++ b/modules/yn
@@ -7,7 +7,7 @@
 Depends-on:
 
 configure.ac:
-gl_MATHFUNC([yn])
+gl_MATHFUNC([yn], [double], [(int, double)])
 
 Makefile.am: