Hello world,

In the fix for PR 91783, I had not considered the case that
the _data ref could also be somewhere inside. The solution was
obvious and simple: Move the check into the loop over the refs.

Committed as r279086 after regression-testing.

Regards

        Thomas

2019-12-08  Thomas Koenig  <tkoe...@gcc.gnu.org>

        PR fortran/92755
        * dependency.c (gfc_dep_resolver):  Move skipping of _data ref
        into the loop.

2019-12-08  Thomas Koenig  <tkoe...@gcc.gnu.org>

        PR fortran/92755
        * gfortran.dg/dependency_57.f90: New test.
Index: dependency.c
===================================================================
--- dependency.c	(Revision 279064)
+++ dependency.c	(Arbeitskopie)
@@ -2098,18 +2098,6 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf
   gfc_dependency this_dep;
   bool same_component = false;
 
-  /* The refs might come in mixed, one with a _data component and one
-     without.  Look at their next reference in order to avoid an
-     ICE.  */
-
-  if (lref && lref->type == REF_COMPONENT && lref->u.c.component
-      && strcmp (lref->u.c.component->name, "_data") == 0)
-    lref = lref->next;
-
-  if (rref && rref->type == REF_COMPONENT && rref->u.c.component
-      && strcmp (rref->u.c.component->name, "_data") == 0)
-    rref = rref->next;
-
   this_dep = GFC_DEP_ERROR;
   fin_dep = GFC_DEP_ERROR;
   /* Dependencies due to pointers should already have been identified.
@@ -2117,6 +2105,18 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gf
 
   while (lref && rref)
     {
+      /* The refs might come in mixed, one with a _data component and one
+	 without.  Look at their next reference in order to avoid an
+	 ICE.  */
+
+      if (lref && lref->type == REF_COMPONENT && lref->u.c.component
+	  && strcmp (lref->u.c.component->name, "_data") == 0)
+	lref = lref->next;
+
+      if (rref && rref->type == REF_COMPONENT && rref->u.c.component
+	  && strcmp (rref->u.c.component->name, "_data") == 0)
+	rref = rref->next;
+
       /* We're resolving from the same base symbol, so both refs should be
 	 the same type.  We traverse the reference chain until we find ranges
 	 that are not equal.  */
! { dg-do compile }
! PR 92755 - this used to cause an ICE.
! Original test case by Gerhard Steinmetz
program p
   type t
   end type
   type t2
      class(t), allocatable :: a(:)
   end type
   type(t2) :: z
   z%a = [z%a]
end

Reply via email to