gdb/fortran: add support for accessing fields of extended types
authorBernhard Heckel <bernhard.heckel@intel.com>
Tue, 5 Apr 2022 15:44:46 +0000 (17:44 +0200)
committerNils-Christian Kempke <nils-christian.kempke@intel.com>
Fri, 8 Apr 2022 10:17:13 +0000 (12:17 +0200)
commit87e10e9c288c2f6c933f235b623522c8d9a2d727
tree5501d64f3c0e33b7079ed2f92bf0e65000ffbe02
parent916c9be4a31d91ee0ebbb33efbf87a8e3cf13349
gdb/fortran: add support for accessing fields of extended types

Fortran 2003 supports type extension.  This patch allows access
to inherited members by using their fully qualified name as described
in the Fortran standard.

In doing so the patch also fixes a bug in GDB when trying to access the
members of a base class in a derived class via the derived class' base
class member.

This patch fixes PR22497 and PR26373 on GDB side.

Using the example Fortran program from PR22497

program mvce
  implicit none

  type :: my_type
     integer :: my_int
  end type my_type

  type, extends(my_type) :: extended_type
  end type extended_type

  type(my_type) :: foo
  type(extended_type) :: bar

  foo%my_int = 0
  bar%my_int = 1

  print*, foo, bar

end program mvce

and running this with GDB and setting a BP at 17:

Before:
(gdb) p bar%my_type
A syntax error in expression, near `my_type'.
(gdb) p bar%my_int
There is no member named my_int.
(gdb) p bar%my_type%my_int
A syntax error in expression, near `my_type%my_int'.
(gdb) p bar
$1 = ( my_type = ( my_int = 1 ) )

After:
(gdb) p bar%my_type
$1 = ( my_int = 1 )
(gdb) p bar%my_int
$2 = 1                 # this line requires DW_TAG_inheritance to work
(gdb) p bar%my_type%my_int
$3 = 1
(gdb) p bar
$4 = ( my_type = ( my_int = 1 ) )

In the above example "p bar%my_int" requires the compiler to emit
information about the inheritance relationship between extended_type
and my_type which gfortran and flang currently do not de.  The
respective issue gcc/49475 has been put as kfail.

Co-authored-by: Nils-Christian Kempke <nils-christian.kempke@intel.com>
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=26373
     https://sourceware.org/bugzilla/show_bug.cgi?id=22497
gdb/f-exp.y
gdb/testsuite/gdb.fortran/oop_extend_type.exp [new file with mode: 0755]
gdb/testsuite/gdb.fortran/oop_extend_type.f90 [new file with mode: 0755]
gdb/valops.c