]> Savannah Git Hosting - gnulib.git/commitdiff
totalorder*: Fix compilation error on glibc 2.25..2.30.
authorBruno Haible <bruno@clisp.org>
Sat, 7 Oct 2023 10:49:15 +0000 (12:49 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 7 Oct 2023 11:01:10 +0000 (13:01 +0200)
* m4/totalorder.m4 (gl_FUNC_TOTALORDERF): Test whether <math.h> has an
incompatible declaration of totalorderf, and set REPLACE_TOTALORDERF
to 1 if so.
(gl_FUNC_TOTALORDER): Test whether <math.h> has an incompatible
declaration of totalorder, and set REPLACE_TOTALORDER to 1 if so.
(gl_FUNC_TOTALORDERL): Test whether <math.h> has an incompatible
declaration of totalorderl, and set REPLACE_TOTALORDERL to 1 if so.

ChangeLog
m4/totalorder.m4

index df6f68ff1eec6daf11a6373f2245c9be4b899957..94f8906aef024f28b34fb9554cc44b2f77f64dce 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2023-10-07  Bruno Haible  <bruno@clisp.org>
+
+       totalorder*: Fix compilation error on glibc 2.25..2.30.
+       * m4/totalorder.m4 (gl_FUNC_TOTALORDERF): Test whether <math.h> has an
+       incompatible declaration of totalorderf, and set REPLACE_TOTALORDERF
+       to 1 if so.
+       (gl_FUNC_TOTALORDER): Test whether <math.h> has an incompatible
+       declaration of totalorder, and set REPLACE_TOTALORDER to 1 if so.
+       (gl_FUNC_TOTALORDERL): Test whether <math.h> has an incompatible
+       declaration of totalorderl, and set REPLACE_TOTALORDERL to 1 if so.
+
 2023-10-07  Bruno Haible  <bruno@clisp.org>
 
        isnan: Avoid dangerous shell coding pattern.
index 02c01fcd1a38414dc0924e120d7dddc10e0fb8b5..ce264f4c65cbf3b9fe7458fcc03a4b00d315848f 100644 (file)
@@ -9,22 +9,36 @@ AC_DEFUN([gl_FUNC_TOTALORDERF],
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
-  gl_MATHFUNC([totalorderf], [int],
-    [(float const *, float const *)],
-    [extern
-     #ifdef __cplusplus
-     "C"
-     #endif
-     int totalorderf (float const *, float const *);
+  dnl glibc versions < 2.31 had an incompatible declaration of this function,
+  dnl see <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=42760d764649ad82f5fe45a26cbdf2c2500409f7>
+  AC_CACHE_CHECK([whether totalorderf has a non-standard declaration],
+    [gl_cv_func_totalorderf_incompatible],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <math.h>
+          ]],
+          [[extern
+            #ifdef __cplusplus
+            "C"
+            #endif
+            int totalorderf (float const *, float const *);
+          ]])
+       ],
+       [gl_cv_func_totalorderf_incompatible=no],
+       [gl_cv_func_totalorderf_incompatible=yes])
     ])
-  AS_IF([test $gl_cv_func_totalorderf_no_libm != yes &&
-         test $gl_cv_func_totalorderf_in_libm != yes],
-    [if test $gl_cv_func_totalorderf_in_libm != yes; then
-       HAVE_TOTALORDERF=0
-     else
-       REPLACE_TOTALORDERF=1
-     fi
-     TOTALORDERF_LIBM='$(ISNANF_LIBM)'])
+  if test $gl_cv_func_totalorderf_incompatible = yes; then
+    REPLACE_TOTALORDERF=1
+  else
+    gl_MATHFUNC([totalorderf], [int], [(float const *, float const *)])
+    if test $gl_cv_func_totalorderf_no_libm != yes \
+       && test $gl_cv_func_totalorderf_in_libm != yes; then
+      HAVE_TOTALORDERF=0
+    fi
+  fi
+  if test $HAVE_TOTALORDERF = 0 || test $REPLACE_TOTALORDERF = 1; then
+    TOTALORDERF_LIBM='$(ISNANF_LIBM)'
+  fi
   AC_SUBST([TOTALORDERF_LIBM])
 ])
 
@@ -33,22 +47,36 @@ AC_DEFUN([gl_FUNC_TOTALORDER],
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
-  gl_MATHFUNC([totalorder], [int],
-    [(double const *, double const *)],
-    [extern
-     #ifdef __cplusplus
-     "C"
-     #endif
-     int totalorder (double const *, double const *);
+  dnl glibc versions < 2.31 had an incompatible declaration of this function,
+  dnl see <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=42760d764649ad82f5fe45a26cbdf2c2500409f7>
+  AC_CACHE_CHECK([whether totalorder has a non-standard declaration],
+    [gl_cv_func_totalorder_incompatible],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <math.h>
+          ]],
+          [[extern
+            #ifdef __cplusplus
+            "C"
+            #endif
+            int totalorder (double const *, double const *);
+          ]])
+       ],
+       [gl_cv_func_totalorder_incompatible=no],
+       [gl_cv_func_totalorder_incompatible=yes])
     ])
-  AS_IF([test $gl_cv_func_totalorder_no_libm != yes &&
-         test $gl_cv_func_totalorder_in_libm != yes],
-    [if test $gl_cv_func_totalorder_in_libm != yes; then
-       HAVE_TOTALORDER=0
-     else
-       REPLACE_TOTALORDER=1
-     fi
-     TOTALORDER_LIBM='$(ISNAND_LIBM)'])
+  if test $gl_cv_func_totalorder_incompatible = yes; then
+    REPLACE_TOTALORDER=1
+  else
+    gl_MATHFUNC([totalorder], [int], [(double const *, double const *)])
+    if test $gl_cv_func_totalorder_no_libm != yes \
+       && test $gl_cv_func_totalorder_in_libm != yes; then
+      HAVE_TOTALORDER=0
+    fi
+  fi
+  if test $HAVE_TOTALORDER = 0 || test $REPLACE_TOTALORDER = 1; then
+    TOTALORDER_LIBM='$(ISNAND_LIBM)'
+  fi
   AC_SUBST([TOTALORDER_LIBM])
 ])
 
@@ -57,24 +85,38 @@ AC_DEFUN([gl_FUNC_TOTALORDERL],
   AC_REQUIRE([gl_MATH_H_DEFAULTS])
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
-  gl_MATHFUNC([totalorderl], [int],
-    [(long double const *, long double const *)],
-    [extern
-     #ifdef __cplusplus
-     "C"
-     #endif
-     int totalorderl (long double const *, long double const *);
-    ])
-  AS_IF([test $gl_cv_func_totalorderl_no_libm != yes &&
-         test $gl_cv_func_totalorderl_in_libm != yes],
-    [if test $gl_cv_func_totalorderl_in_libm != yes; then
-       HAVE_TOTALORDERL=0
-     else
-       REPLACE_TOTALORDERL=1
-     fi
-     TOTALORDERL_LIBM='$(ISNANL_LIBM)'
-     dnl Prerequisite of lib/totalorderl.c.
-     gl_LONG_DOUBLE_SIGN_LOCATION
+  dnl glibc versions < 2.31 had an incompatible declaration of this function,
+  dnl see <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=42760d764649ad82f5fe45a26cbdf2c2500409f7>
+  AC_CACHE_CHECK([whether totalorderl has a non-standard declaration],
+    [gl_cv_func_totalorderl_incompatible],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <math.h>
+          ]],
+          [[extern
+            #ifdef __cplusplus
+            "C"
+            #endif
+            int totalorderl (long double const *, long double const *);
+          ]])
+       ],
+       [gl_cv_func_totalorderl_incompatible=no],
+       [gl_cv_func_totalorderl_incompatible=yes])
     ])
+  if test $gl_cv_func_totalorderl_incompatible = yes; then
+    REPLACE_TOTALORDERL=1
+  else
+    gl_MATHFUNC([totalorderl], [int],
+      [(long double const *, long double const *)])
+    if test $gl_cv_func_totalorderl_no_libm != yes \
+       && test $gl_cv_func_totalorderl_in_libm != yes; then
+      HAVE_TOTALORDERL=0
+    fi
+  fi
+  if test $HAVE_TOTALORDERL = 0 || test $REPLACE_TOTALORDERL = 1; then
+    TOTALORDERL_LIBM='$(ISNANL_LIBM)'
+    dnl Prerequisite of lib/totalorderl.c.
+    gl_LONG_DOUBLE_SIGN_LOCATION
+  fi
   AC_SUBST([TOTALORDERL_LIBM])
 ])