* gnu-v3-abi.c (gnuv3_baseclass_offset): Check whether
authorDaniel Jacobowitz <drow@false.org>
Fri, 22 Aug 2003 20:45:55 +0000 (20:45 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 22 Aug 2003 20:45:55 +0000 (20:45 +0000)
TYPE_VPTR_FIELDNO is valid.

gdb/ChangeLog
gdb/gnu-v3-abi.c

index 0efa2ae2d275c585cc5418269b93d43b1097ffb1..c995ae230a009cfbe446b08f530b625effe2226d 100644 (file)
@@ -1,3 +1,8 @@
+2003-08-22  Daniel Jacobowitz  <drow@mvista.com>
+
+       * gnu-v3-abi.c (gnuv3_baseclass_offset): Check whether
+       TYPE_VPTR_FIELDNO is valid.
+
 2003-08-19  Mark Kettenis  <kettenis@gnu.org>
 
        * utils.c (set_width_command): Remove prototypes.
index d9947f9f87da70c837f5b4a7b40fdb1ef59f4dbe..b18e644796eda82da58c35be71ffa1c07a09c08f 100644 (file)
@@ -412,10 +412,15 @@ gnuv3_baseclass_offset (struct type *type, int index, char *valaddr,
      v3 C++ ABI Section 2.4.I.2.b.  Fortunately the ABI guarantees that the
      vtable pointer will be located at the beginning of the object, so we can
      bypass the casting.  Verify that the TYPE_VPTR_FIELDNO is in fact at the
-     start of whichever baseclass it resides in, as a sanity measure.  */
+     start of whichever baseclass it resides in, as a sanity measure - iff
+     we have debugging information for that baseclass.  */
 
   vbasetype = TYPE_VPTR_BASETYPE (type);
-  if (TYPE_FIELD_BITPOS (vbasetype, TYPE_VPTR_FIELDNO (vbasetype)) != 0)
+  if (TYPE_VPTR_FIELDNO (vbasetype) < 0)
+    fill_in_vptr_fieldno (vbasetype);
+
+  if (TYPE_VPTR_FIELDNO (vbasetype) >= 0
+      && TYPE_FIELD_BITPOS (vbasetype, TYPE_VPTR_FIELDNO (vbasetype)) != 0)
     error ("Illegal vptr offset in class %s",
           TYPE_NAME (vbasetype) ? TYPE_NAME (vbasetype) : "<unknown>");