diff options
author | Harald Anlauf <anlauf@gmx.de> | 2022-07-18 22:34:53 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2022-07-19 23:25:08 +0200 |
commit | f838d15641d256e21ffc126c3277b290ed743928 (patch) | |
tree | 2205b6bb13743ed0faa7c6f37a13284991a9c28e /gcc/fortran | |
parent | c66dc02384782e9456ceffb2f72b8f724c4f6a94 (diff) | |
download | gcc-f838d15641d256e21ffc126c3277b290ed743928.zip gcc-f838d15641d256e21ffc126c3277b290ed743928.tar.gz gcc-f838d15641d256e21ffc126c3277b290ed743928.tar.bz2 |
Fortran: error recovery on invalid array reference of non-array [PR103590]
gcc/fortran/ChangeLog:
PR fortran/103590
* resolve.cc (find_array_spec): Change function result to bool to
enable error recovery. Generate error message for invalid array
reference of non-array entity instead of an internal error.
(gfc_resolve_ref): Use function result from find_array_spec for
error recovery.
gcc/testsuite/ChangeLog:
PR fortran/103590
* gfortran.dg/associate_54.f90: Adjust.
* gfortran.dg/associate_59.f90: New test.
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/resolve.cc | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 2ebf076..ca11475 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -4976,7 +4976,7 @@ gfc_resolve_dim_arg (gfc_expr *dim) static void resolve_assoc_var (gfc_symbol* sym, bool resolve_target); -static void +static bool find_array_spec (gfc_expr *e) { gfc_array_spec *as; @@ -5004,7 +5004,11 @@ find_array_spec (gfc_expr *e) { case REF_ARRAY: if (as == NULL) - gfc_internal_error ("find_array_spec(): Missing spec"); + { + gfc_error ("Invalid array reference of a non-array entity at %L", + &ref->u.ar.where); + return false; + } ref->u.ar.as = as; as = NULL; @@ -5028,6 +5032,8 @@ find_array_spec (gfc_expr *e) if (as != NULL) gfc_internal_error ("find_array_spec(): unused as(2)"); + + return true; } @@ -5346,7 +5352,8 @@ gfc_resolve_ref (gfc_expr *expr) for (ref = expr->ref; ref; ref = ref->next) if (ref->type == REF_ARRAY && ref->u.ar.as == NULL) { - find_array_spec (expr); + if (!find_array_spec (expr)) + return false; break; } |