This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don't use C99 ULL constant suffix
authorKarl Williamson <khw@cpan.org>
Thu, 25 Jan 2018 17:25:27 +0000 (10:25 -0700)
committerKarl Williamson <khw@cpan.org>
Mon, 29 Jan 2018 23:33:03 +0000 (16:33 -0700)
The suffix ULL in, e.g., 7ULL, is C99, and since perl supports C89, we
can't use it.  Change these occurrences to wrap those that would exceed
32 bits to use UINTMAX_C(...).

perl.h has logic to define that macro appropriately if the compiler
doesn't already know it.

inline.h

index d0e2ff7..6c460e5 100644 (file)
--- a/inline.h
+++ b/inline.h
@@ -547,10 +547,12 @@ S__variant_byte_number(PERL_UINTMAX_T word)
     /* Here 'word' has a single bit set, the  msb is of the first byte which
      * has it set.  Calculate that position in the word.  We can use this
      * specialized solution: https://stackoverflow.com/a/32339674/1626653,
-     * assumes an 8-bit byte */
-    word = (word >> 7) * (( 7ULL << 56) | (15ULL << 48) | (23ULL << 40)
-                        | (31ULL << 32) | (39ULL << 24) | (47ULL << 16)
-                        | (55ULL <<  8) | (63ULL <<  0));
+     * assumes an 8-bit byte.  (On a 32-bit machine, the larger numbers should
+     * just get shifted off at compile time) */
+    word = (word >> 7) * ((UINTMAX_C( 7) << 56) | (UINTMAX_C(15) << 48)
+                        | (UINTMAX_C(23) << 40) | (UINTMAX_C(31) << 32)
+                        |           (39 <<  24) |           (47 <<  16)
+                        |           (55 <<   8) |           (63 <<   0));
     word >>= PERL_WORDSIZE * 7; /* >> by either 56 or 24 */
 
     /* Here, word contains the position 7..63 of that bit.  Convert to 0..7 */