* stabs.c (parse_stab_type): Fix handling of template names with
authorIan Lance Taylor <ian@airs.com>
Thu, 8 Jul 1999 00:49:04 +0000 (00:49 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 8 Jul 1999 00:49:04 +0000 (00:49 +0000)
template parameters containing `::'.
(stab_demangle_type): Handle a qualified name in a pointer to
member.

binutils/ChangeLog
binutils/stabs.c

index 0b592141d837fedb55625fd3c147261cf7b0d35a..aeded36309247c2ce91f2ee34f77cdf4b07fdaa1 100644 (file)
@@ -1,3 +1,10 @@
+1999-07-08  Ian Lance Taylor  <ian@zembu.com>
+
+       * stabs.c (parse_stab_type): Fix handling of template names with
+       template parameters containing `::'.
+       (stab_demangle_type): Handle a qualified name in a pointer to
+       member.
+
 1999-06-23  Ian Lance Taylor  <ian@zembu.com>
 
        * Makefile.am (dlltool_SOURCES): Add dyn-string.c.
index a47b3bd4cadd4c34bf729edc0156192062a9d56f..945f87645ecdff7f25b858e4a59b644dccf186dd 100644 (file)
@@ -1,5 +1,5 @@
 /* stabs.c -- Parse stabs debugging information
-   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
    Written by Ian Lance Taylor <ian@cygnus.com>.
 
    This file is part of GNU Binutils.
@@ -1316,14 +1316,21 @@ parse_stab_type (dhandle, info, typename, pp, slotp)
            bad_stab (orig);
            return DEBUG_TYPE_NULL;
          }
-       while (q1 != NULL && p > q1 && p[1] == ':')
+       if (q1 != NULL && p > q1 && p[1] == ':')
          {
-           q2 = strchr (q1, '>');
-           if (q2 == NULL || q2 < p)
-             break;
-           p += 2;
-           p = strchr (p, ':');
-           if (p == NULL)
+           int nest = 0;
+
+           for (q2 = q1; *q2 != '\0'; ++q2)
+             {
+               if (*q2 == '<')
+                 ++nest;
+               else if (*q2 == '>')
+                 --nest;
+               else if (*q2 == ':' && nest == 0)
+                 break;
+             }
+           p = q2;
+           if (*p != ':')
              {
                bad_stab (orig);
                return DEBUG_TYPE_NULL;
@@ -4785,6 +4792,7 @@ stab_demangle_type (minfo, pp, ptype)
     case 'O':
       {
        boolean memberp, constp, volatilep;
+       debug_type class_type = DEBUG_TYPE_NULL;
        debug_type *args;
        boolean varargs;
        unsigned int n;
@@ -4797,19 +4805,40 @@ stab_demangle_type (minfo, pp, ptype)
        varargs = false;
 
        ++*pp;
-       if (isdigit ((unsigned char) **pp))
+       if (isdigit ((unsigned char) **pp))
          {
-           stab_bad_demangle (orig);
-           return false;
+           n = stab_demangle_count (pp);
+           if (strlen (*pp) < n)
+             {
+               stab_bad_demangle (orig);
+               return false;
+             }
+           name = *pp;
+           *pp += n;
+
+           if (ptype != NULL)
+             {
+               class_type = stab_find_tagged_type (minfo->dhandle,
+                                                   minfo->info,
+                                                   name, (int) n,
+                                                   DEBUG_KIND_CLASS);
+               if (class_type == DEBUG_TYPE_NULL)
+                 return false;
+             }
          }
-       n = stab_demangle_count (pp);
-       if (strlen (*pp) < n)
+       else if (**pp == 'Q')
+         {
+           if (! stab_demangle_qualified (minfo, pp,
+                                          (ptype == NULL
+                                           ? (debug_type *) NULL
+                                           : &class_type)))
+             return false;
+         }
+       else
          {
            stab_bad_demangle (orig);
            return false;
          }
-       name = *pp;
-       *pp += n;
 
        if (memberp)
          {
@@ -4851,14 +4880,6 @@ stab_demangle_type (minfo, pp, ptype)
 
        if (ptype != NULL)
          {
-           debug_type class_type;
-
-           class_type = stab_find_tagged_type (minfo->dhandle, minfo->info,
-                                               name, (int) n,
-                                               DEBUG_KIND_CLASS);
-           if (class_type == DEBUG_TYPE_NULL)
-             return false;
-
            if (! memberp)
              *ptype = debug_make_offset_type (minfo->dhandle, class_type,
                                               *ptype);