Hello world, I have committed the attached patch to trunk as obvious after regression-testing. Will commit to gcc6 soon.
Regards Thomas 2016-10-10 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/77915 * frontend-passes.c (inline_matmul_assign): Return early if inside a FORALL statement. 2016-10-10 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/77915 * gfortran.dg/matmul_11.f90: New test.
Index: frontend-passes.c =================================================================== --- frontend-passes.c (Revision 240927) +++ frontend-passes.c (Arbeitskopie) @@ -2857,6 +2857,11 @@ inline_matmul_assign (gfc_code **c, int *walk_subt if (in_where) return 0; + /* The BLOCKS generated for the temporary variables and FORALL don't + mix. */ + if (forall_level > 0) + return 0; + /* For now don't do anything in OpenMP workshare, it confuses its translation, which expects only the allowed statements in there. We should figure out how to parallelize this eventually. */
! { dg-do compile } ! { dg-options "-ffrontend-optimize -fdump-tree-original" } ! PR 77915 - ICE of matmul with forall. program x integer, parameter :: d = 3 real,dimension(d,d,d) :: cube,xcube real, dimension(d,d) :: cmatrix integer :: i,j forall(i=1:d,j=1:d) xcube(i,j,:) = matmul(cmatrix,cube(i,j,:)) end forall end program x ! { dg-final { scan-tree-dump-times "_gfortran_matmul" 1 "original" } }