diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2def55d883..65ba222512 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-03-05 Tom Tromey + + * value.c (value_primitive_field): Don't fetch contents for + non-virtual bases. + 2012-03-05 Tom Tromey * jv-valprint.c (java_value_print): Correctly compute 'obj_addr'. diff --git a/gdb/value.c b/gdb/value.c index bee6907413..e8eb33f340 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2556,11 +2556,17 @@ value_primitive_field (struct value *arg1, int offset, if (VALUE_LVAL (arg1) == lval_register && value_lazy (arg1)) value_fetch_lazy (arg1); - boffset = baseclass_offset (arg_type, fieldno, - value_contents (arg1), - value_embedded_offset (arg1), - value_address (arg1), - arg1); + /* We special case virtual inheritance here because this + requires access to the contents, which we would rather avoid + for references to ordinary fields of unavailable values. */ + if (BASETYPE_VIA_VIRTUAL (arg_type, fieldno)) + boffset = baseclass_offset (arg_type, fieldno, + value_contents (arg1), + value_embedded_offset (arg1), + value_address (arg1), + arg1); + else + boffset = TYPE_FIELD_BITPOS (arg_type, fieldno) / 8; if (value_lazy (arg1)) v = allocate_value_lazy (value_enclosing_type (arg1));