From e5082f82b46bc84f1b193d48decb72a49c261110 Mon Sep 17 00:00:00 2001 From: rupothar Date: Fri, 8 Apr 2022 16:05:41 +0530 Subject: [PATCH] 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=) 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 --- gdb/gdbtypes.c | 11 +++++++---- gdb/gdbtypes.h | 1 - gdb/testsuite/gdb.fortran/assumedrank.exp | 7 +++++++ gdb/testsuite/gdb.fortran/assumedrank.f90 | 3 +++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 49ecb199b07..395bd63a251 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2398,10 +2398,13 @@ 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. GDB considers the variable as an array so discard + the array type and return the target type which is of variable. */ + type->main_type->target_type->main_type->dyn_prop_list = + type->main_type->dyn_prop_list; + type = TYPE_TARGET_TYPE (type); + return type; } else if (type->code () == TYPE_CODE_STRING && rank != 1) { diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 769328cc9cd..7437e1db8ab 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -2092,7 +2092,6 @@ extern void allocate_gnat_aux_type (struct type *); #define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type #define TYPE_RVALUE_REFERENCE_TYPE(thistype) (thistype)->rvalue_reference_type #define TYPE_CHAIN(thistype) (thistype)->chain -#define TYPE_DYN_PROP(thistype) TYPE_MAIN_TYPE(thistype)->dyn_prop_list /* * Note that if thistype is a TYPEDEF type, you have to call check_typedef. But check_typedef does set the TYPE_LENGTH of the TYPEDEF type, so you only have to call check_typedef once. Since allocate_value diff --git a/gdb/testsuite/gdb.fortran/assumedrank.exp b/gdb/testsuite/gdb.fortran/assumedrank.exp index 69cd168125f..bd058e01e89 100644 --- a/gdb/testsuite/gdb.fortran/assumedrank.exp +++ b/gdb/testsuite/gdb.fortran/assumedrank.exp @@ -58,6 +58,13 @@ while { $test_count < 500 } { } } + # XFAIL rank 0 for flang. + if {$test_count == 1 && [test_compiler_info {clang-*}]} { + setup_xfail "*-*-*" + fail "compiler does not support rank 0" + continue + } + if ($found_final_breakpoint) { break } diff --git a/gdb/testsuite/gdb.fortran/assumedrank.f90 b/gdb/testsuite/gdb.fortran/assumedrank.f90 index 7f077c3f014..7f7cf2c1f3e 100644 --- a/gdb/testsuite/gdb.fortran/assumedrank.f90 +++ b/gdb/testsuite/gdb.fortran/assumedrank.f90 @@ -19,16 +19,19 @@ PROGRAM arank + REAL :: array0 REAL :: array1(10) REAL :: array2(1, 2) REAL :: array3(3, 4, 5) REAL :: array4(4, 5, 6, 7) + array0 = 0 array1 = 1.0 array2 = 2.0 array3 = 3.0 array4 = 4.0 + call test_rank (array0) call test_rank (array1) call test_rank (array2) call test_rank (array3) -- 2.17.1