From 8f94c94fe5a92494b51685a55ccbebea00628b7d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 4 Jun 2004 19:39:51 +0000 Subject: [PATCH] * lib/autoconf/c.m4 (AC_LANG_BOOL_COMPILE_TRY (C)): Use division by zero. --- ChangeLog | 11 +++++++++++ lib/autoconf/c.m4 | 13 +++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4174392a..2c040cbf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-06-04 Paul Eggert + + * lib/autoconf/c.m4 (AC_LANG_BOOL_COMPILE_TRY (C)): Use division + by zero instead of array size, so that we can use any arithmetic + constant expression (instead of requiring an integer constant + expression). This allows us to test expressions like DBL_MAX < + LDBL_MAX, which didn't conform to the C standard using the old + method. + (AC_C_LONG_DOUBLE): Put back in the tests for LDBL_MAX and LDBL_EPSILON, + now that we can do floating-point tests at compile time. + 2004-06-02 Paul Eggert * lib/autoconf/c.m4 (AC_C_LONG_DOUBLE): Don't check LDBL_MAX diff --git a/lib/autoconf/c.m4 b/lib/autoconf/c.m4 index 2e98f154..621d465a 100644 --- a/lib/autoconf/c.m4 +++ b/lib/autoconf/c.m4 @@ -228,11 +228,14 @@ char (*f) () = $1; # AC_LANG_BOOL_COMPILE_TRY(C)(PROLOGUE, EXPRESSION) # ------------------------------------------------- -# Be sure to use this array to avoid `unused' warnings, which are even -# errors with `-W error'. +# The C standard does not require a diagnostic when we compute 1 / 0 +# at compile-time, but we don't know of any compiler that fails to +# diagnose this. Diagnostics are required for some other expressions +# (e.g., ((EXPRESSION) ? 0 : (0, 0)), INT_MAX + !!(EXPRESSION)), +# but they don't work as well in practice. m4_define([AC_LANG_BOOL_COMPILE_TRY(C)], -[AC_LANG_PROGRAM([$1], [static int test_array @<:@1 - 2 * !($2)@:>@; -test_array @<:@0@:>@ = 0 +[AC_LANG_PROGRAM([$1], [static int v = 1 / !!($2); +v = 0; ])]) @@ -965,6 +968,8 @@ AC_DEFUN([AC_C_LONG_DOUBLE], + (DBL_MANT_DIG < LDBL_MANT_DIG) - (LDBL_MAX_EXP < DBL_MAX_EXP) - (LDBL_MANT_DIG < DBL_MANT_DIG))) + && (0 < ((DBL_MAX < LDBL_MAX) + (LDBL_EPSILON < DBL_EPSILON) + - (LDBL_MAX < DBL_MAX) - (DBL_EPSILON < LDBL_EPSILON))) && (int) LDBL_EPSILON == 0 ]])], ac_cv_c_long_double=yes,