re PR fortran/91717 (ICE on concatenating deferred-length character and character...
authorPaul Thomas <pault@gcc.gnu.org>
Fri, 13 Sep 2019 05:41:01 +0000 (05:41 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Fri, 13 Sep 2019 05:41:01 +0000 (05:41 +0000)
2019-09-13  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/91717
* dependency.c (gfc_dep_resolver): Flag identical components
and exit with return value 1 if set and no array refs.

2019-09-13  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/91717
* gfortran.dg/dependency_55.f90 : New test.

From-SVN: r275696

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

index 17021990936f1c246f64ac699c830856e7444c0f..bf721c7d43e832d22852a64d67899f454c3e764c 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-13  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/91717
+       * dependency.c (gfc_dep_resolver): Flag identical components
+       and exit with return value 1 if set and no array refs.
+
 2019-09-11  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/91553
index da4a37c9e953ccba1e4d8d8fcc8be9da37f93270..51148709766fb9261dc2c9d95299644fe9390265 100644 (file)
@@ -2096,6 +2096,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse,
   int m;
   gfc_dependency fin_dep;
   gfc_dependency this_dep;
+  bool same_component = false;
 
   this_dep = GFC_DEP_ERROR;
   fin_dep = GFC_DEP_ERROR;
@@ -2115,6 +2116,8 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse,
             components.  */
          if (lref->u.c.component != rref->u.c.component)
            return 0;
+
+         same_component = true;
          break;
 
        case REF_SUBSTRING:
@@ -2280,6 +2283,10 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, gfc_reverse *reverse,
   if (lref || rref)
     return 1;
 
+  /* This can result from concatenation of assumed length string components.  */
+  if (same_component && fin_dep == GFC_DEP_ERROR)
+    return 1;
+
   /* If we haven't seen any array refs then something went wrong.  */
   gcc_assert (fin_dep != GFC_DEP_ERROR);
 
index cd805625ee619facb1583f5a4dbdecb616526ee2..ab1d7bc9312fc719b78d1e3844ce22d1a94d46d3 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-13  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/91717
+       * gfortran.dg/dependency_55.f90 : New test.
+
 2019-09-12  Uroš Bizjak  <ubizjak@gmail.com>
 
        PR tree-optimization/89386
diff --git a/gcc/testsuite/gfortran.dg/dependency_55.f90 b/gcc/testsuite/gfortran.dg/dependency_55.f90
new file mode 100644 (file)
index 0000000..53898b3
--- /dev/null
@@ -0,0 +1,18 @@
+! { dg-do run }
+!
+! Test the fix for PR91717 in which the concatenation operation ICEd.
+!
+! Contributed by Damian Rouson  <damian@sourceryinstitute.org>
+!
+  type core
+    character (len=:), allocatable :: msg
+  end type
+
+  type(core) :: my_core
+
+  my_core%msg = ""
+  my_core%msg = my_core%msg//"my message is: "
+  my_core%msg = my_core%msg//"Hello!"
+
+  if (my_core%msg .ne. "my message is: Hello!") stop 1
+end