summaryrefslogtreecommitdiff
path: root/gdb/gdbtypes.c
diff options
context:
space:
mode:
authorrupothar <rupesh.potharla@amd.com>2022-04-08 16:05:41 +0530
committerKavitha Natarajan <kavitha.natarajan@amd.com>2022-04-25 14:58:30 +0530
commit5f59e7e0c75a35f32f11bf6998c2e3de333fe3b2 (patch)
treedec1fb834efabef863a6ce2d8f332aa793ee4c98 /gdb/gdbtypes.c
parent2b718529b99d2ca53552558ba9b3ff3f22663795 (diff)
downloadbinutils-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.c22
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)
{