]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
Fix AC_TYPE_UINT64_T on Tru64 with gcc 3.4.4.
authorEric Blake <ebb9@byu.net>
Tue, 20 Oct 2009 14:30:03 +0000 (08:30 -0600)
committerEric Blake <ebb9@byu.net>
Wed, 21 Oct 2009 00:44:49 +0000 (18:44 -0600)
* lib/autoconf/types.m4 (_AC_TYPE_UNSIGNED_INT_BODY)
(_AC_TYPE_INT_BODY): Avoid undefined behavior of attempting shift
wider than type.
* NEWS: Document this.
Reported by Rainer Orth.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
NEWS
lib/autoconf/types.m4

index 82dd475b700364b795c86806c4967909e472a255..a2f56f73e62323c21fbd8f73fac1ea8716275e12 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-10-20  Eric Blake  <ebb9@byu.net>
+
+       Fix AC_TYPE_UINT64_T on Tru64 with gcc 3.4.4.
+       * lib/autoconf/types.m4 (_AC_TYPE_UNSIGNED_INT_BODY)
+       (_AC_TYPE_INT_BODY): Avoid undefined behavior of attempting shift
+       wider than type.
+       * NEWS: Document this.
+       Reported by Rainer Orth.
+
 2009-10-17  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        Fix a couple of index entries in the manual.
diff --git a/NEWS b/NEWS
index f7384268a3bc47994ca0e40221c6387958a54277..666cd4fbf7e05bd86d6239afc13e35a229a33275 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,10 @@ GNU Autoconf NEWS - User visible changes.
    made it fail with some Fortran compilers (regression introduced in
    2.64).
 
+** The AC_TYPE_UINT64_T and AC_TYPE_INT64_T macros have been fixed to no
+   longer mistakenly select a 32-bit type on some compilers (bug present
+   since macros were introduced in 2.59c).
+
 ** The following documented autotest macros are new:
    AT_CHECK_EUNIT
 
index a53796709c805c42e6cfd6e732a3b2eb86d7ead5..7a73fc2959a5d327e551b04330aec1ad113dd171 100644 (file)
@@ -629,17 +629,21 @@ m4_define([_AC_TYPE_INT_BODY],
 [  AS_LINENO_PUSH([$[]1])
   AC_CACHE_CHECK([for int$[]2_t], [$[]3],
     [AS_VAR_SET([$[]3], [no])
+     # Order is important - never check a type that is potentially smaller
+     # than half of the expected target width.
      for ac_type in int$[]2_t 'int' 'long int' \
         'long long int' 'short int' 'signed char'; do
        AC_COMPILE_IFELSE(
         [AC_LANG_BOOL_COMPILE_TRY(
            [AC_INCLUDES_DEFAULT],
-           [0 < ($ac_type) (((($ac_type) 1 << ($[]2 - 2)) - 1) * 2 + 1)])],
+           [enum { N = $[]2 / 2 - 1 };
+            0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)])],
         [AC_COMPILE_IFELSE(
            [AC_LANG_BOOL_COMPILE_TRY(
               [AC_INCLUDES_DEFAULT],
-              [($ac_type) (((($ac_type) 1 << ($[]2 - 2)) - 1) * 2 + 1)
-                < ($ac_type) (((($ac_type) 1 << ($[]2 - 2)) - 1) * 2 + 2)])],
+              [enum { N = $[]2 / 2 - 1 };
+               ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
+                < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2)])],
            [],
            [AS_CASE([$ac_type], [int$[]2_t],
               [AS_VAR_SET([$[]3], [yes])],
@@ -679,12 +683,14 @@ m4_define([_AC_TYPE_UNSIGNED_INT_BODY],
 [  AS_LINENO_PUSH([$[]1])
   AC_CACHE_CHECK([for uint$[]2_t], $[]3,
     [AS_VAR_SET([$[]3], [no])
+     # Order is important - never check a type that is potentially smaller
+     # than half of the expected target width.
      for ac_type in uint$[]2_t 'unsigned int' 'unsigned long int' \
         'unsigned long long int' 'unsigned short int' 'unsigned char'; do
        AC_COMPILE_IFELSE(
         [AC_LANG_BOOL_COMPILE_TRY(
            [AC_INCLUDES_DEFAULT],
-           [($ac_type) -1 >> ($[]2 - 1) == 1])],
+           [(($ac_type) -1 >> ($[]2 / 2 - 1)) >> ($[]2 / 2 - 1) == 3])],
         [AS_CASE([$ac_type], [uint$[]2_t],
            [AS_VAR_SET([$[]3], [yes])],
            [AS_VAR_SET([$[]3], [$ac_type])])])