xdiff: avoid more compiler warnings with XDL_FAST_HASH on 32-bit machines
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Tue, 22 May 2012 20:36:39 +0000 (22:36 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 May 2012 16:10:03 +0000 (09:10 -0700)
Hide literals that can cause compiler warnings for 32-bit architectures in
expressions that evaluate to small numbers there. Some compilers warn that
0x0001020304050608 won't fit into a 32-bit long, others that shifting right
by 56 bits clears a 32-bit value completely.

The correct values are calculated in the 64-bit case, which is all that matters
in this if-branch.

Reported-by: Øyvind A. Holm <sunny@sunbase.org>
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Acked-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
xdiff/xutils.c
index 277ccdff024436b78e74f357103a0621836422ee..2021117799ac9c6ede0407ae3d943ec30bd05b73 100644 (file)
@@ -301,7 +301,13 @@ static inline long count_masked_bytes(unsigned long mask)
                 * that works for the bytemasks without having to
                 * mask them first.
                 */
-               return mask * 0x0001020304050608 >> 56;
+               /*
+                * return mask * 0x0001020304050608 >> 56;
+                *
+                * Doing it like this avoids warnings on 32-bit machines.
+                */
+               long a = (REPEAT_BYTE(0x01) / 0xff + 1);
+               return mask * a >> (sizeof(long) * 7);
        } else {
                /*
                 * Modified Carl Chatfield G+ version for 32-bit *