diff options
-rw-r--r-- | gdb/gdbtypes.c | 22 | ||||
-rw-r--r-- | gdb/gdbtypes.h | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.fortran/assumedrank.exp | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.fortran/assumedrank.f90 | 3 |
4 files changed, 27 insertions, 5 deletions
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 49ecb19..2a51372 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) { diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 769328c..7437e1d 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 69cd168..e9429b4 100644 --- a/gdb/testsuite/gdb.fortran/assumedrank.exp +++ b/gdb/testsuite/gdb.fortran/assumedrank.exp @@ -58,6 +58,12 @@ while { $test_count < 500 } { } } + # Currently, flang does not support rank0. + if {$test_count == 1 && [test_compiler_info {clang-*}]} { + unsupported "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 7f077c3..7f7cf2c 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) |