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.
This commit is contained in:
Daniel Jacobowitz 2002-10-02 22:01:53 +00:00
parent ad050da3e6
commit cef4f5dd72
3 changed files with 16 additions and 6 deletions

View file

@ -1,3 +1,11 @@
2002-10-02 Daniel Jacobowitz <drow@mvista.com>
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-02 Elena Zannoni <ezannoni@redhat.com>
* inferior.h (registers_info, stepi_command, nexti_command,

View file

@ -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;
}
}

View file

@ -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) : "<unknown>");
/* Now that we know which base class is defining our virtual
function, cast our value to that baseclass. This takes care of