autoconf-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: autoconf-2.59 and AC_C_LONG_DOUBLE: comments and a proposal


From: Paul Eggert
Subject: Re: autoconf-2.59 and AC_C_LONG_DOUBLE: comments and a proposal
Date: Fri, 04 Jun 2004 12:42:24 -0700
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)

Following up on my previous message, I looked at the C standard and decided
that the Autoconf boolean tests can do an integer division by zero when
a compile-time test fails.  That should be pretty safe, and it allows
tests for floating-point expressions.  So I installed this further patch.

2004-06-04  Paul Eggert  <address@hidden>

        * 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.

--- c.m4.~1.188.~       2004-06-04 10:36:54 -0700
+++ c.m4        2004-06-04 12:37:10 -0700
@@ -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,




reply via email to

[Prev in Thread] Current Thread [Next in Thread]