From 33e5f26535788bc413ff48ae58d9d82faefcf439 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 | 10 ++++++---- gdb/testsuite/gdb.fortran/assumedrank.exp | 7 +++++++ gdb/testsuite/gdb.fortran/assumedrank.f90 | 3 +++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 49ecb199b07..c2d142ac3cc 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2398,10 +2398,12 @@ 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_DYN_PROP(TYPE_TARGET_TYPE(type)) = TYPE_DYN_PROP(type); + type = TYPE_TARGET_TYPE(type); + return type; } else if (type->code () == TYPE_CODE_STRING && rank != 1) { diff --git a/gdb/testsuite/gdb.fortran/assumedrank.exp b/gdb/testsuite/gdb.fortran/assumedrank.exp index 69cd168125f..49b03e2f87f 100644 --- a/gdb/testsuite/gdb.fortran/assumedrank.exp +++ b/gdb/testsuite/gdb.fortran/assumedrank.exp @@ -14,6 +14,7 @@ # along with this program. If not, see . # Testing GDB's implementation of ASSUMED RANK arrays. +#Until the assumed rank zero is fixed in clang, XFAIL this case for clang. if {[skip_fortran_tests]} { return -1 } @@ -58,6 +59,12 @@ while { $test_count < 500 } { } } + # xfail rank 0 for clang + if {$test_count == 1 && [test_compiler_info {clang-*}]} { + xfail "clang compiler does not support rank0" + 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