https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109948
--- Comment #12 from anlauf at gcc dot gnu.org --- (In reply to anlauf from comment #11) > I think it does not handle the following variation of the testcase from > the blamed patch: This one seems to be handled by the clumsy attempt: diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 75d61a18856..a5dcf07c1ee 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -5622,6 +5625,21 @@ gfc_expression_rank (gfc_expr *e) { if (e->expr_type == EXPR_ARRAY) goto done; + + /* Take rank from associate target. */ + if (e->symtree + && e->symtree->n.sym->as == NULL + && e->symtree->n.sym->assoc + && e->symtree->n.sym->assoc->target + && e->symtree->n.sym->assoc->rankguessed + && e->symtree->n.sym->assoc->target->ref + && e->symtree->n.sym->assoc->target->ref->u.ar.type == AR_FULL + && e->symtree->n.sym->assoc->target->ref->u.ar.as) + { + e->rank = e->symtree->n.sym->assoc->target->ref->u.ar.as->rank; + goto done; + } + /* Constructors can have a rank different from one via RESHAPE(). */ e->rank = ((e->symtree == NULL || e->symtree->n.sym->as == NULL) @@ -5640,7 +5658,7 @@ gfc_expression_rank (gfc_expr *e) if (ref->type != REF_ARRAY) continue; - if (ref->u.ar.type == AR_FULL) + if (ref->u.ar.type == AR_FULL && ref->u.ar.as) { rank = ref->u.ar.as->rank; break; Of course this does not address the point brought up by Mikael.