This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
handy.h Fix withinCOUNT() for > 32 bit operands
authorKarl Williamson <khw@cpan.org>
Mon, 9 Sep 2019 20:57:07 +0000 (14:57 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 26 Sep 2019 04:30:43 +0000 (22:30 -0600)
It needs to cast to unsigned in all circumstances; prior to this commit
it failed to do so for oprands wider than 32 bits

handy.h

diff --git a/handy.h b/handy.h
index d9cd92d..f011882 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -1317,7 +1317,7 @@ or casts
 #define FITS_IN_8_BITS(c) (1)
 #endif
 
-/* Returns true if l <= c <= l + n, where 'l' and 'n' are non-negative
+/* Returns true if l <= c <= (l + n), where 'l' and 'n' are non-negative
  * Written this way so that after optimization, only one conditional test is
  * needed. */
 #define withinCOUNT(c, l, n) (__ASSERT_((l) >= 0) __ASSERT_((n) >= (0))        \
@@ -1331,7 +1331,7 @@ or casts
     : (sizeof(c) == sizeof(U16)) ? withinCOUNT(((U16) (c)), (l), ((u) - (l)))  \
     : (sizeof(c) == sizeof(U32)) ? withinCOUNT(((U32) (c)), (l), ((u) - (l)))  \
     : (__ASSERT_(sizeof(c) == sizeof(WIDEST_UTYPE))                            \
-                                   withinCOUNT((      (c)), (l), ((u) - (l))))))
+                          withinCOUNT(((WIDEST_UTYPE) (c)), (l), ((u) - (l))))))
 
 #ifdef EBCDIC
 #   ifndef _ALL_SOURCE