[fortran,committed] Fix PR 95812, ICE in dependency analysis

Message ID f315ee66-3f62-e7d6-19b4-a44f1ed2899a@netcologne.de
State New
Headers show
Series
  • [fortran,committed] Fix PR 95812, ICE in dependency analysis
Related show

Commit Message

Richard Biener via Gcc-patches June 23, 2020, 6:17 a.m.
Hello world,

I just committed the attached patch to master as obvious and simple
after regression-testing.  Will also backport to gcc-10, where
the original regression occurred.

Regards

	Thomas

Handle AR_FULL vs. AR_FULL in dependency checking.

Previously, handling of full vs. full references failed to take
AR_FULL vs. AR_FULL into account.  A change in dependency
checking in gcc 10 created a code path that could lead there;
with this patch, this is now correctly handled.

gcc/fortran/ChangeLog:

2020-06-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/95812
	* dependency.c (ref_same_as_full_array): Handle case of AR_FULL
	vs. AR_FULL.

gcc/testsuite/ChangeLog:

2020-06-23  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/95812
	* gfortran.dg/dependency_59.f90: New test.

Patch

diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c
index f6c68409e68..7edd5d9010d 100644
--- a/gcc/fortran/dependency.c
+++ b/gcc/fortran/dependency.c
@@ -2033,6 +2033,8 @@  ref_same_as_full_array (gfc_ref *full_ref, gfc_ref *ref)
     return false;
   if (ref->type != REF_ARRAY)
     return false;
+  if (ref->u.ar.type == AR_FULL)
+    return true;
   if (ref->u.ar.type != AR_SECTION)
     return false;
 
diff --git a/gcc/testsuite/gfortran.dg/dependency_59.f90 b/gcc/testsuite/gfortran.dg/dependency_59.f90
new file mode 100644
index 00000000000..90c6532392c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dependency_59.f90
@@ -0,0 +1,15 @@ 
+! { dg-do compile }
+! PR 95812 - this caused an ICE.
+! Test case by Jakub Jelinek.
+
+module test
+contains
+  subroutine foo()
+    integer :: a(3)
+    a = 1
+    print *, matmul(1*reshape(a,(/3,1/)), reshape((/1,1,1/),(/1,3/)))
+  end subroutine foo
+  subroutine bar()
+    call foo()
+  end subroutine bar
+end module test