[Top][All Lists]
[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,