]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
Don't worry about preprocessor when testing long long.
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 13 Nov 2007 08:16:19 +0000 (00:16 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 13 Nov 2007 08:16:19 +0000 (00:16 -0800)
See: http://lists.gnu.org/archive/html/bug-gnulib/2007-11/msg00075.html
* doc/autoconf.texi (Preprocessor Arithmetic): New section.
(AC_TYPE_LONG_LONG_INT, AC_TYPE_UNSIGNED_LONG_LONG_INT):
These no longer check for preprocessor flaws.
* lib/autoconf/types.m4 (_AC_TYPE_LONG_LONG_SNIPPET):
Do not check for preprocessor flows.

ChangeLog
doc/autoconf.texi
lib/autoconf/types.m4

index cc23b5a956aec9a5c11690aa6ec28d22b64d7e6d..79c6cc196e4c3a412ff79cb2044123324020acec 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-11-13  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Don't worry about preprocessor when testing long long.
+       See: http://lists.gnu.org/archive/html/bug-gnulib/2007-11/msg00075.html
+       * doc/autoconf.texi (Preprocessor Arithmetic): New section.
+       (AC_TYPE_LONG_LONG_INT, AC_TYPE_UNSIGNED_LONG_LONG_INT):
+       These no longer check for preprocessor flaws.
+       * lib/autoconf/types.m4 (_AC_TYPE_LONG_LONG_SNIPPET):
+       Do not check for preprocessor flows.
+
 2007-11-13  Jim Meyering  <meyering@redhat.com>
 
        Adapt dependencies, now that a version change doesn't modify configure.ac
index 8633fa2cf5389c299821027bfbddfa83465ef9ec..12eef55fd764a34cc8c01657afd9a45ae2e9ea8a 100644 (file)
@@ -518,6 +518,7 @@ Portable C and C++ Programming
 
 * Varieties of Unportability::  How to make your programs unportable
 * Integer Overflow::            When integers get too large
+* Preprocessor Arithmetic::     @code{#if} expression problems
 * Null Pointers::               Properties of null pointers
 * Buffer Overruns::             Subscript errors and the like
 * Volatile Objects::            @code{volatile} and signals
@@ -6123,8 +6124,10 @@ range or precision than the @code{double} type, define
 @acindex{TYPE_LONG_LONG_INT}
 @cvindex HAVE_LONG_LONG_INT
 If the C compiler supports a working @code{long long int} type, define
-@code{HAVE_LONG_LONG_INT}.  This test also validates that the
-preprocessor can handle integers with the @samp{LL} suffix.
+@code{HAVE_LONG_LONG_INT}.  However, this test does not test
+@code{long long int} values in preprocessor @code{#if} expressions,
+because too many compilers mishandle such expressions.
+@xref{Preprocessor Arithmetic}.
 @end defmac
 
 @defmac AC_TYPE_MBSTATE_T
@@ -6261,12 +6264,10 @@ exists.
 @acindex{TYPE_UNSIGNED_LONG_LONG_INT}
 @cvindex HAVE_UNSIGNED_LONG_LONG_INT
 If the C compiler supports a working @code{unsigned long long int} type,
-define @code{HAVE_UNSIGNED_LONG_LONG_INT}.  This test also validates
-that the preprocessor can handle integers with the @samp{ULL} suffix.
-However, portable code cannot mix @code{unsigned long int} and
-@code{unsigned long long int} types in preprocessor expressions,
-since the @acronym{HP-UX} 11.00 preprocessor does not use consistent
-promotion rules.
+define @code{HAVE_UNSIGNED_LONG_LONG_INT}.  However, this test does not test
+@code{unsigned long long int} values in preprocessor @code{#if} expressions,
+because too many compilers mishandle such expressions.
+@xref{Preprocessor Arithmetic}.
 @end defmac
 
 @node Generic Types
@@ -16291,6 +16292,7 @@ more information.
 @menu
 * Varieties of Unportability::  How to make your programs unportable
 * Integer Overflow::            When integers get too large
+* Preprocessor Arithmetic::     @code{#if} expression problems
 * Null Pointers::               Properties of null pointers
 * Buffer Overruns::             Subscript errors and the like
 * Volatile Objects::            @code{volatile} and signals
@@ -16656,6 +16658,20 @@ of these two values typically yields the same signal on these CPUs,
 even though the C standard requires @code{INT_MIN % -1} to yield zero
 because the expression does not overflow.
 
+@node Preprocessor Arithmetic
+@section Preprocessor Arithmetic
+@cindex preprocessor arithmetic
+
+In C99, preprocessor arithmetic, used for @code{#if} expressions, must
+be evaluated as if all signed values are of type @code{intmax_t} and all
+unsigned values of type @code{uintmax_t}.  Many compilers are buggy in
+this area, though.  For example, as of 2007, Sun C mishandles @code{#if
+LLONG_MIN < 0} on a platform with 32-bit @code{long int} and 64-bit
+@code{long long int}.  Also, some older preprocessors mishandle
+constants ending in @code{LL}.  To work around these problems, you can
+compute the value of expressions like @code{LONG_MAX < LLONG_MAX} at
+@code{configure}-time rather than at @code{#if}-time.
+
 @node Null Pointers
 @section Properties of Null Pointers
 @cindex null pointers
index 9c38a7bb581f7e18f3c478d9b4e43f176e408113..6f03738032b48eda203f8b5ed246bb5675cb2e39 100644 (file)
@@ -475,14 +475,7 @@ You should use `AC_TYPE_LONG_DOUBLE' or `AC_TYPE_LONG_DOUBLE_WIDER' instead.]
 AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
 [
   AC_LANG_PROGRAM(
-    [[/* Test preprocessor.  */
-      #if ! (-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
-        error in preprocessor;
-      #endif
-      #if ! (18446744073709551615ULL <= -1ull)
-        error in preprocessor;
-      #endif
-      /* Test literals.  */
+    [[/* Test literals.  */
       long long int ll = 9223372036854775807ll;
       long long int nll = -9223372036854775807LL;
       unsigned long long int ull = 18446744073709551615ULL;