* gdbtypes.c (fill_in_vptr_fieldno): Don't ignore the first
authorMichael Tiemann <tiemann@cygnus>
Mon, 1 Feb 1993 01:11:17 +0000 (01:11 +0000)
committerMichael Tiemann <tiemann@cygnus>
Mon, 1 Feb 1993 01:11:17 +0000 (01:11 +0000)
baseclass--we don't always inherit its virtual function table
pointer.

gdb/ChangeLog
gdb/gdbtypes.c

index a23403b3248de4c346185009e24a185288ac2326..7cdbd4035fcdf921e8d009b640740e1305d4a8b3 100644 (file)
@@ -1,5 +1,9 @@
 Sun Jan 31 04:32:48 1993  Michael Tiemann  (tiemann@rtl.cygnus.com)
 
+       * gdbtypes.c (fill_in_vptr_fieldno): Don't ignore the first
+       baseclass--we don't always inherit its virtual function table
+       pointer.
+
        * eval.c (evaluate_subexp): In OP_FUNCALL case, adjust `this'
        pointer correctly in case value_struct_elt moves it around.
 
index 57871796fca4a3f568157666198e47366ca7f418..4be115d4fe470fc08973f8719a597fdf12731e0c 100644 (file)
@@ -690,9 +690,9 @@ lookup_template_type (name, type, block)
   return (SYMBOL_TYPE (sym));
 }
 
-/* Given a type TYPE, lookup the type of the component of type named
-   NAME.  
-   If NOERR is nonzero, return zero if NAME is not suitably defined.  */
+/* Given a type TYPE, lookup the type of the component of type named NAME.  
+   If NOERR is nonzero, return zero if NAME is not suitably defined.
+   If NAME is the name of a baseclass type, return that type.  */
 
 struct type *
 lookup_struct_elt_type (type, name, noerr)
@@ -718,6 +718,9 @@ lookup_struct_elt_type (type, name, noerr)
 
   check_stub_type (type);
 
+  if (STREQ (type_name_no_tag (type), name))
+    return type;
+
   for (i = TYPE_NFIELDS (type) - 1; i >= TYPE_N_BASECLASSES (type); i--)
     {
       char *t_field_name = TYPE_FIELD_NAME (type, i);
@@ -765,7 +768,10 @@ fill_in_vptr_fieldno (type)
   if (TYPE_VPTR_FIELDNO (type) < 0)
     {
       int i;
-      for (i = 1; i < TYPE_N_BASECLASSES (type); i++)
+
+      /* We must start at zero in case the first (and only) baseclass is
+        virtual (and hence we cannot share the table pointer).  */
+      for (i = 0; i < TYPE_N_BASECLASSES (type); i++)
        {
          fill_in_vptr_fieldno (TYPE_BASECLASS (type, i));
          if (TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, i)) >= 0)