From: Daniel Jacobowitz Date: Wed, 2 Oct 2002 22:09:01 +0000 (+0000) Subject: Fix PR gdb/778 X-Git-Tag: gdb_5_3-2002-12-12-release~125 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7eabb30a3ea204ad6c71a79a4582506785eabc44;p=thirdparty%2Fbinutils-gdb.git Fix PR gdb/778 * gdbtypes.c (fill_in_vptr_fieldno): Call check_typedef before recursing. * gnu-v3-abi.c (gnuv3_virtual_fn_field): Check return value of fill_in_vptr_fieldno. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 30200b2ac20..cfde49692a9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2002-10-02 Daniel Jacobowitz + + Fix PR gdb/778 + * gdbtypes.c (fill_in_vptr_fieldno): Call check_typedef + before recursing. + * gnu-v3-abi.c (gnuv3_virtual_fn_field): Check return value + of fill_in_vptr_fieldno. + 2002-10-01 Alexandre Oliva * mips-tdep.c (mips_find_abi_section): .mdebug.abi64 is the name diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 6ebbf2db1b6..121fcbe4eaa 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -1276,13 +1276,12 @@ fill_in_vptr_fieldno (struct type *type) 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) + struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i)); + fill_in_vptr_fieldno (baseclass); + if (TYPE_VPTR_FIELDNO (baseclass) >= 0) { - TYPE_VPTR_FIELDNO (type) - = TYPE_VPTR_FIELDNO (TYPE_BASECLASS (type, i)); - TYPE_VPTR_BASETYPE (type) - = TYPE_VPTR_BASETYPE (TYPE_BASECLASS (type, i)); + TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (baseclass); + TYPE_VPTR_BASETYPE (type) = TYPE_VPTR_BASETYPE (baseclass); break; } } diff --git a/gdb/gnu-v3-abi.c b/gdb/gnu-v3-abi.c index fbab8af0a18..2b4e01a78a4 100644 --- a/gdb/gnu-v3-abi.c +++ b/gdb/gnu-v3-abi.c @@ -324,6 +324,9 @@ gnuv3_virtual_fn_field (struct value **value_p, type now. */ if (TYPE_VPTR_FIELDNO (vfn_base) < 0) fill_in_vptr_fieldno (vfn_base); + if (TYPE_VPTR_FIELDNO (vfn_base) < 0) + error ("Could not find virtual table pointer for class \"%s\".", + TYPE_TAG_NAME (vfn_base) ? TYPE_TAG_NAME (vfn_base) : ""); /* Now that we know which base class is defining our virtual function, cast our value to that baseclass. This takes care of