re PR fortran/92755 (ICE in gfc_dep_resolver, at fortran/dependency.c:2123)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 8 Dec 2019 12:25:15 +0000 (12:25 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 8 Dec 2019 12:25:15 +0000 (12:25 +0000)
2019-12-08  Thomas Koenig  <tkoenig@gcc.gnu.org>

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

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

PR fortran/92755
* gfortran.dg/dependency_57.f90: New test.

From-SVN: r279086

gcc/fortran/ChangeLog
gcc/fortran/dependency.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dependency_57.f90 [new file with mode: 0644]

index 080f92e70c9376ae384ab282579341aaaca6c692..60114dba76343f500dab69cee5be20c414aeb958 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-08  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/92755
+       * dependency.c (gfc_dep_resolver):  Move skipping of _data ref
+       into the loop.
+
 2019-12-07  Tobias Burnus  <tobias@codesourcery.com>
 
        PR fortran/92793
@@ -28,7 +34,7 @@
 2019-12-06  Tobias Burnus  <tobias@codesourcery.com>
            Kwok Cheung Yeung  <kcy@codesourcery.com>
 
-       * trans-openmp.c (gfc_build_conditional_assign, 
+       * trans-openmp.c (gfc_build_conditional_assign,
        gfc_build_conditional_assign_expr): New static functions.
        (gfc_omp_finish_clause, gfc_trans_omp_clauses): Handle mapping of
        absent optional arguments and fix mapping of present optional args.
index 02e4b4f7a6555db65ef934495103fa7d7e0f6fac..394d85b48a2fe0cd67db56583f2ac34d3f9c8513 100644 (file)
@@ -2098,18 +2098,6 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse,
   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, gfc_reverse *reverse,
 
   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.  */
index c1b954271be4b70820f8ebe287b3eadedc572a41..6c28808cee26b287dda74e59a2d7e2e83c07bc60 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-08  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/92755
+       * gfortran.dg/dependency_57.f90: New test.
+
 2019-12-08  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * g++.dg/cpp0x/gen-attrs-36.C: Update expected diagnostics.
diff --git a/gcc/testsuite/gfortran.dg/dependency_57.f90 b/gcc/testsuite/gfortran.dg/dependency_57.f90
new file mode 100644 (file)
index 0000000..fdf95b2
--- /dev/null
@@ -0,0 +1,12 @@
+! { 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