diff options
author | rupothar <rupesh.potharla@amd.com> | 2022-04-08 16:05:41 +0530 |
---|---|---|
committer | Kavitha Natarajan <kavitha.natarajan@amd.com> | 2022-04-25 14:58:30 +0530 |
commit | 5f59e7e0c75a35f32f11bf6998c2e3de333fe3b2 (patch) | |
tree | dec1fb834efabef863a6ce2d8f332aa793ee4c98 /gdb/gdbtypes.c | |
parent | 2b718529b99d2ca53552558ba9b3ff3f22663795 (diff) | |
download | binutils-gdb-5f59e7e0c75a35f32f11bf6998c2e3de333fe3b2.tar.gz |
gdb/fortran: Support for assumed rank zero
If a variable is passed to function in FORTRAN as an argument the
variable is treated as an array with rank zero. GDB currently does
not support the case for assumed rank 0. This patch provides support
for assumed rank 0 and updates the testcase as well.
Without patch:
Breakpoint 1, arank::sub1 (a=<error reading variable:
failed to resolve dynamic array rank>) at assumedrank.f90:11
11 PRINT *, RANK(a)
(gdb) p a
failed to resolve dynamic array rank
(gdb) p rank(a)
failed to resolve dynamic array rank
With patch:
Breakpoint 1, arank::sub1 (a=0) at assumedrank.f90:11
11 PRINT *, RANK(a)
(gdb) p a
$1 = 0
(gdb) p rank(a)
$2 = 0
Diffstat (limited to 'gdb/gdbtypes.c')
-rw-r--r-- | gdb/gdbtypes.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 49ecb199b07..2a51372a037 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -47,6 +47,9 @@ /* The value of an invalid conversion badness. */ #define INVALID_CONVERSION 100 +static struct dynamic_prop_list * +copy_dynamic_prop_list (struct obstack *, struct dynamic_prop_list *); + /* Initialize BADNESS constants. */ const struct rank LENGTH_MISMATCH_BADNESS = {INVALID_CONVERSION,0}; @@ -2398,10 +2401,21 @@ resolve_dynamic_array_or_string (struct type *type, if (rank == 0) { - /* The dynamic property list juggling below was from the original - patch. I don't understand what this is all about, so I've - commented it out for now and added the following error. */ - error (_("failed to resolve dynamic array rank")); + /* Rank is zero, if a variable is passed as an argument to a + function. In this case the resolved type should not be an + array, but should instead be that of an array element. */ + struct type *dynamic_array_type = type; + type = copy_type (TYPE_TARGET_TYPE (dynamic_array_type)); + struct dynamic_prop_list *prop_list + = TYPE_MAIN_TYPE (dynamic_array_type)->dyn_prop_list; + if (prop_list != nullptr) + { + struct obstack *obstack + = &type->objfile_owner ()->objfile_obstack; + TYPE_MAIN_TYPE (type)->dyn_prop_list + = copy_dynamic_prop_list (obstack, prop_list); + } + return type; } else if (type->code () == TYPE_CODE_STRING && rank != 1) { |