merge from gcc
authorDJ Delorie <dj@redhat.com>
Mon, 31 Mar 2008 18:11:50 +0000 (18:11 +0000)
committerDJ Delorie <dj@redhat.com>
Mon, 31 Mar 2008 18:11:50 +0000 (18:11 +0000)
libiberty/ChangeLog
libiberty/cp-demangle.c

index c85691c40e1f2de3c4fa741917f64b52034c86cc..0e8424d56e8c6c9bb8b72a5d6a45ce44dd607937 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.
index edcfedca7a59f338a4a44afd3d298410a7f1ee85..82107bc35482500127ebe953d966283d1f02b42f 100644 (file)
@@ -1,5 +1,6 @@
 /* Demangler for g++ V3 ABI.
-   Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008
+   Free Software Foundation, Inc.
    Written by Ian Lance Taylor <ian@wasabisystems.com>.
 
    This file is part of the libiberty library, which is part of GCC.
@@ -2681,21 +2682,24 @@ d_substitution (struct d_info *di, int prefix)
   c = d_next_char (di);
   if (c == '_' || IS_DIGIT (c) || IS_UPPER (c))
     {
-      int id;
+      unsigned int id;
 
       id = 0;
       if (c != '_')
        {
          do
            {
+             unsigned int new_id;
+
              if (IS_DIGIT (c))
-               id = id * 36 + c - '0';
+               new_id = id * 36 + c - '0';
              else if (IS_UPPER (c))
-               id = id * 36 + c - 'A' + 10;
+               new_id = id * 36 + c - 'A' + 10;
              else
                return NULL;
-             if (id < 0)
+             if (new_id < id)
                return NULL;
+             id = new_id;
              c = d_next_char (di);
            }
          while (c != '_');
@@ -2703,7 +2707,7 @@ d_substitution (struct d_info *di, int prefix)
          ++id;
        }
 
-      if (id >= di->next_sub)
+      if (id >= (unsigned int) di->next_sub)
        return NULL;
 
       ++di->did_subs;