OSDN Git Service

* cp-demangle.c (d_substitution): Correct overflow check to avoid
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Mar 2008 17:38:38 +0000 (17:38 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 31 Mar 2008 17:38:38 +0000 (17:38 +0000)
-fstrict-overflow optimizations.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@133761 138bc75d-0d04-0410-961f-82ee72b054a4

libiberty/ChangeLog
libiberty/cp-demangle.c

index c85691c..0e8424d 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-31  Ian Lance Taylor  <iant@google.com>
+
+       * cp-demangle.c (d_substitution): Correct overflow check to avoid
+       -fstrict-overflow optimizations.
+
 2008-03-27  Paolo Bonzini  <bonzini@gnu.org>
 
        * configure.ac (frags): Don't set, use frag instead.
 2008-03-27  Paolo Bonzini  <bonzini@gnu.org>
 
        * configure.ac (frags): Don't set, use frag instead.
index edcfedc..71a28ab 100644 (file)
@@ -2681,21 +2681,24 @@ d_substitution (struct d_info *di, int prefix)
   c = d_next_char (di);
   if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
     {
   c = d_next_char (di);
   if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
     {
-      int id;
+      unsigned int id;
 
       id = 0;
       if (c != '_')
        {
          do
            {
 
       id = 0;
       if (c != '_')
        {
          do
            {
+             unsigned int new_id;
+
              if (IS_DIGIT (c))
              if (IS_DIGIT (c))
-               id = id * 36 + c - '0';
+               new_id = id * 36 + c - '0';
              else if (IS_UPPER (c))
              else if (IS_UPPER (c))
-               id = id * 36 + c - 'A' + 10;
+               new_id = id * 36 + c - 'A' + 10;
              else
                return NULL;
              else
                return NULL;
-             if (id < 0)
+             if (new_id < id)
                return NULL;
                return NULL;
+             id = new_id;
              c = d_next_char (di);
            }
          while (c != '_');
              c = d_next_char (di);
            }
          while (c != '_');
@@ -2703,7 +2706,7 @@ d_substitution (struct d_info *di, int prefix)
          ++id;
        }
 
          ++id;
        }
 
-      if (id >= di->next_sub)
+      if (id >= (unsigned int) di->next_sub)
        return NULL;
 
       ++di->did_subs;
        return NULL;
 
       ++di->did_subs;