Modified Files:
authorKung Hsu <kung@cygnus>
Fri, 12 Nov 1993 19:34:24 +0000 (19:34 +0000)
committerKung Hsu <kung@cygnus>
Fri, 12 Nov 1993 19:34:24 +0000 (19:34 +0000)
ChangeLog stabsread.c

        * stabsread.c (patch_block_stabs, define_symbol, read_type): in
        g++ template instantiation, nested class can be part of the
        params, and '::' can gets into symbol or type names. This is
        to fix the problem. (fix pr3837)

gdb/ChangeLog
gdb/stabsread.c

index 46a58451c2cb41cc4328e6ee66f6bf75ad99de81..e3057735b3506016260e995dc3dfe23aac8692ec 100644 (file)
@@ -1,5 +1,10 @@
 Fri Nov 12 11:18:02 1993  Kung Hsu  (kung@cirdan.cygnus.com)
 
+       * stabsread.c (patch_block_stabs, define_symbol, read_type): in
+       g++ template instantiation, nested class can be part of the
+       params, and '::' can gets into symbol or type names. This is
+       to fix the problem.
+
        * gdbtypes.c (lookup_struct_elt_type): Handle type ref or pointer
        to struct/union case.
 
index 2ebaa6cc80b397cf43ff2816b0102a4ee75a44a3..d038ca65459ac4cd47ebc78c8b8f03947ff8b211 100644 (file)
@@ -367,6 +367,11 @@ patch_block_stabs (symbols, stabs, objfile)
        {
          name = stabs->stab[ii];
          pp = (char*) strchr (name, ':');
+         while (pp[1] == ':')
+           {
+              pp += 2;
+              pp = (char *)strchr(pp, ':');
+           }
          sym = find_symbol_in_list (symbols, name, pp-name);
          if (!sym)
            {
@@ -485,6 +490,12 @@ define_symbol (valu, string, desc, type, objfile)
   if (p == 0)
     return 0;
 
+  while (p[1] == ':')
+    {
+       p += 2;
+       p = strchr(p, ':');
+    }
+
   /* If a nameless stab entry, all we need is the type, not the symbol.
      e.g. ":t10=*2" or a nameless enum like " :T16=ered:0,green:1,blue:2,;" */
   nameless = (p == string || ((string[0] == ' ') && (string[1] == ':')));
@@ -1295,7 +1306,7 @@ read_type (pp, objfile)
        char *type_name;
        
        {
-         char *from, *to;
+         char *from, *to, *p;
          
          /* Set the type code according to the following letter.  */
          switch ((*pp)[0])
@@ -1312,16 +1323,21 @@ read_type (pp, objfile)
            default:
              return error_type (pp);
            }
-         
-         to = type_name = (char *)
-           obstack_alloc (&objfile -> type_obstack,
-                          (((char *) strchr (*pp, ':') - (*pp)) + 1));
+          
+         p = strchr(*pp, ':');
+         while (p[1] == ':')
+           {
+              p += 2;
+              p = strchr(p, ':');
+           }
+         to = type_name = 
+               (char *)obstack_alloc (&objfile->type_obstack, p - *pp + 1);
        
          /* Copy the name.  */
          from = *pp + 1;
-         while ((*to++ = *from++) != ':')
-           ;
-         *--to = '\0';
+         while (from < p) 
+           *to++ = *from++;
+         *to = '\0';
          
          /* Set the pointer ahead of the name which we just read.  */
          *pp = from;