gdb/fortran: resolve dynamic types when readjusting after an indirection
authorAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 9 Jul 2020 15:26:23 +0000 (16:26 +0100)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Sat, 25 Jul 2020 00:30:20 +0000 (01:30 +0100)
commite79eb02f2f09baecffb144bac6804f975065466f
treee1a92e0b6eb55bb577cb18a2caafab54685ab8d8
parent719251fee155d5d4ede91f555e8898460e6b1731
gdb/fortran: resolve dynamic types when readjusting after an indirection

After dereferencing a pointer (in value_ind) or following a
reference (in coerce_ref) we call readjust_indirect_value_type to
"fixup" the type of the resulting value object.

This fixup handles cases relating to the type of the resulting object
being different (a sub-class) of the original pointers target type.

If we encounter a pointer to a dynamic type then after dereferencing a
pointer (in value_ind) the type of the object created will have had
its dynamic type resolved.  However, in readjust_indirect_value_type,
we use the target type of the original pointer to "fixup" the type of
the resulting value.  In this case, the target type will be a dynamic
type, so the resulting value object, once again has a dynamic type.

This then triggers an assertion later within GDB.

The solution I propose here is that we call resolve_dynamic_type on
the pointer's target type (within readjust_indirect_value_type) so
that the resulting value is not converted back to a dynamic type.

The test case is based on the original test in the bug report.

gdb/ChangeLog:

PR fortran/23051
PR fortran/26139
* valops.c (value_ind): Pass address to
readjust_indirect_value_type.
* value.c (readjust_indirect_value_type): Make parameter
non-const, and add extra address parameter.  Resolve original type
before using it.
* value.h (readjust_indirect_value_type): Update function
signature and comment.

gdb/testsuite/ChangeLog:

PR fortran/23051
PR fortran/26139
* gdb.fortran/class-allocatable-array.exp: New file.
* gdb.fortran/class-allocatable-array.f90: New file.
* gdb.fortran/pointer-to-pointer.exp: New file.
* gdb.fortran/pointer-to-pointer.f90: New file.
gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.fortran/class-allocatable-array.exp [new file with mode: 0644]
gdb/testsuite/gdb.fortran/class-allocatable-array.f90 [new file with mode: 0644]
gdb/testsuite/gdb.fortran/pointer-to-pointer.exp [new file with mode: 0644]
gdb/testsuite/gdb.fortran/pointer-to-pointer.f90 [new file with mode: 0644]
gdb/valops.c
gdb/value.c
gdb/value.h