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.

Reply via email to