Resolve dynamic type in ada_value_struct_elt

An internal AdaCore test case showed that gdb mishandled a case of
assigning to an array element in a packed array inside a variant
record.  This problem can only be seen with -fgnat-encodings=minimal,
which isn't yet widely used.  This patch fixes the bug, and also
updates an existing test to check this case.

gdb/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

	* ada-lang.c (ada_value_struct_elt): Resolve dynamic type.

gdb/testsuite/ChangeLog
2020-11-04  Tom Tromey  <tromey@adacore.com>

	* gdb.ada/set_pckd_arr_elt.exp: Also test
	-fgnat-encodings=minimal.  Add tests.
	* gdb.ada/set_pckd_arr_elt/foo.adb (Foo): Add VA variable.
	Call Update_Small a second time.
	* gdb.ada/set_pckd_arr_elt/pck.adb (New_Variant): New function.
	* gdb.ada/set_pckd_arr_elt/pck.ads (Buffer, Variant)
	(Variant_Access): New types.
	(New_Variant): Declare.
This commit is contained in:
Tom Tromey 2020-11-04 08:49:16 -07:00
parent c9a28cbed6
commit 24aa1b0282
7 changed files with 64 additions and 13 deletions

View file

@ -4396,6 +4396,10 @@ ada_value_struct_elt (struct value *arg, const char *name, int no_err)
t1 = ada_to_fixed_type (ada_get_base_type (t1), NULL,
address, NULL, check_tag);
/* Resolve the dynamic type as well. */
arg = value_from_contents_and_address (t1, nullptr, address);
t1 = value_type (arg);
if (find_struct_field (name, t1, 0,
&field_type, &byte_offset, &bit_offset,
&bit_size, NULL))