Fix latent Ada bug when accessing field offsets
authorTom Tromey <tromey@adacore.com>
Tue, 19 Oct 2021 19:10:27 +0000 (13:10 -0600)
committerTom Tromey <tromey@adacore.com>
Thu, 21 Oct 2021 14:24:40 +0000 (08:24 -0600)
commit4d1795ac4dda0f824eae9fd3f810aeb80a993245
tree62368bcb0292aa6fea105513a1d0bb60765f4713
parentced10cb78d01652f9e1bb1d1e465327dfe1debaa
Fix latent Ada bug when accessing field offsets

The "add accessors for field (and call site) location" patch caused a
gdb crash when running the internal AdaCore testsuite.  This turned
out to be a latent bug in ada-lang.c.

The immediate cause of the bug is that find_struct_field
unconditionally uses TYPE_FIELD_BITPOS.  This causes an assert for a
dynamic type.

This patch fixes the problem by doing two things.  First, it changes
find_struct_field to use a dummy value for the field offset in the
situation where the offset is not actually needed by the caller.  This
works because the offset isn't used in any other way -- only as a
result.

Second, this patch assures that calls to find_struct_field use a
resolved type when the offset is needed.  For
value_tag_from_contents_and_address, this is done by resolving the
type explicitly.  In ada_value_struct_elt, this is done by passing
nullptr for the out parameters when they are not needed (the second
call in this function already uses a resolved type).

Note that, while we believe the parent field probably can't occur at a
variable offset, the patch still updates this code path, just in case.

I've updated an existing test case to reproduce the crash.
I'm checking this in.
gdb/ada-lang.c
gdb/testsuite/gdb.ada/same_component_name.exp
gdb/testsuite/gdb.ada/same_component_name/foo.adb