libiberty: fix warnings about left shifting a negative value.
authorNick Clifton <nickc@redhat.com>
Mon, 21 Dec 2015 08:23:35 +0000 (08:23 +0000)
committerMike Frysinger <vapier@gentoo.org>
Tue, 5 Jan 2016 19:58:34 +0000 (14:58 -0500)
  GCC PR 66827 reports some problems with left shifting a negative
  value:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66827

  Of the problems reported only two remain - in libiberty/regex.c:

libiberty/regex.c:6970:11: runtime error: left shift of negative value -1
libiberty/regex.c:7165:4: runtime error: left shift of negative value -1

  The patch below fixes these errors by casting the value to be shifted
  to unsigned before the shift occurs.

  No regressions were found in the libiberty testsuite or bootstrapping
  gcc (on an x86_64 target).

libiberty/ChangeLog
libiberty/regex.c

index 3d2ff5923b460eae84660e1e8e2997fd0dbecac1..e8fc96acb5b54a289dff8acb84da86d1a7fd0f72 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-21  Nick Clifton  <nickc@redhat.com>
+
+       PR 66827
+       * regex.c (EXTRACT_NUMBER): Cast sign byte to unsigned before left
+       shifting.
+
 2015-11-27  Pedro Alves  <palves@redhat.com>
 
        PR other/61321
index 16338cb206b455d87d275e778d4590500c213216..9ffc3f47f006d89b7c046b704e7ac6cc0ae78d80 100644 (file)
@@ -685,7 +685,7 @@ typedef enum
 #  define EXTRACT_NUMBER(destination, source)                          \
   do {                                                                 \
     (destination) = *(source) & 0377;                                  \
-    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;          \
+    (destination) += ((unsigned) SIGN_EXTEND_CHAR (*((source) + 1))) << 8; \
   } while (0)
 # endif