* stabsread.c (read_member_functions): Remove skip code for duplicate
authorPeter Schauer <Peter.Schauer@mytum.de>
Tue, 19 Mar 2002 20:27:04 +0000 (20:27 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Tue, 19 Mar 2002 20:27:04 +0000 (20:27 +0000)
constructor/destructor methods.  Use standard parsing for these
methods and just do not chain them to the list of methods after
parsing.

gdb/ChangeLog
gdb/stabsread.c

index 8bcab443efb95aa55041e8a4d679c1c0ad3089e7..acdb2c3db6c3477612fb4d1d2b784a0a31019aa2 100644 (file)
@@ -1,3 +1,10 @@
+2002-03-19  Peter Schauer  <pes@regent.e-technik.tu-muenchen.de>
+
+       * stabsread.c (read_member_functions): Remove skip code for duplicate
+       constructor/destructor methods.  Use standard parsing for these
+       methods and just do not chain them to the list of methods after
+       parsing.
+
 2002-03-19  Alexandre Oliva  <aoliva@redhat.com>
 
        * coffread.c: Remove redundant static declarations.  Replace
index bb969dbe78941e5fb8b58bc531e9ec26509b6335..a06b37ff79b8bc0f30fffe8f2c0838b4393c5c0a 100644 (file)
@@ -3037,7 +3037,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
 {
   int nfn_fields = 0;
   int length = 0;
-  int skip_method;
   /* Total number of member functions defined in this class.  If the class
      defines two `f' functions, and one `g' function, then this will have
      the value 3.  */
@@ -3077,36 +3076,6 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
       look_ahead_type = NULL;
       length = 0;
 
-      skip_method = 0;
-      if (p - *pp == strlen ("__base_ctor")
-         && strncmp (*pp, "__base_ctor", strlen ("__base_ctor")) == 0)
-       skip_method = 1;
-      else if (p - *pp == strlen ("__base_dtor")
-              && strncmp (*pp, "__base_dtor", strlen ("__base_dtor")) == 0)
-       skip_method = 1;
-      else if (p - *pp == strlen ("__deleting_dtor")
-              && strncmp (*pp, "__deleting_dtor",
-                          strlen ("__deleting_dtor")) == 0)
-       skip_method = 1;
-
-      if (skip_method)
-       {
-         /* Skip past '::'.  */
-         *pp = p + 2;
-         /* Read the type.  */
-         read_type (pp, objfile);
-         /* Skip past the colon, mangled name, semicolon, flags, and final
-            semicolon.  */
-         while (**pp != ';')
-           (*pp) ++;
-         (*pp) ++;
-         while (**pp != ';')
-           (*pp) ++;
-         (*pp) ++;
-
-         continue;
-       }
-
       new_fnlist = (struct next_fnfieldlist *)
        xmalloc (sizeof (struct next_fnfieldlist));
       make_cleanup (xfree, new_fnlist);
@@ -3332,23 +3301,34 @@ read_member_functions (struct field_info *fip, char **pp, struct type *type,
       while (**pp != ';' && **pp != '\0');
 
       (*pp)++;
+      STABS_CONTINUE (pp, objfile);
 
-      new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
-       obstack_alloc (&objfile->type_obstack,
-                      sizeof (struct fn_field) * length);
-      memset (new_fnlist->fn_fieldlist.fn_fields, 0,
-             sizeof (struct fn_field) * length);
-      for (i = length; (i--, sublist); sublist = sublist->next)
+      /* Skip GCC 3.X member functions which are duplicates of the callable
+        constructor/destructor.  */
+      if (strcmp (main_fn_name, "__base_ctor") == 0
+         || strcmp (main_fn_name, "__base_dtor") == 0
+         || strcmp (main_fn_name, "__deleting_dtor") == 0)
        {
-         new_fnlist->fn_fieldlist.fn_fields[i] = sublist->fn_field;
+         xfree (main_fn_name);
        }
+      else
+       {
+         new_fnlist->fn_fieldlist.fn_fields = (struct fn_field *)
+           obstack_alloc (&objfile->type_obstack,
+                          sizeof (struct fn_field) * length);
+         memset (new_fnlist->fn_fieldlist.fn_fields, 0,
+                 sizeof (struct fn_field) * length);
+         for (i = length; (i--, sublist); sublist = sublist->next)
+           {
+             new_fnlist->fn_fieldlist.fn_fields[i] = sublist->fn_field;
+           }
 
-      new_fnlist->fn_fieldlist.length = length;
-      new_fnlist->next = fip->fnlist;
-      fip->fnlist = new_fnlist;
-      nfn_fields++;
-      total_length += length;
-      STABS_CONTINUE (pp, objfile);
+         new_fnlist->fn_fieldlist.length = length;
+         new_fnlist->next = fip->fnlist;
+         fip->fnlist = new_fnlist;
+         nfn_fields++;
+         total_length += length;
+       }
     }
 
   if (nfn_fields)