Hello world, the attached patch fixes a regression where a rejects-valid would be issued.
OK for the affected branches, trunk and gcc-7? Regards Thomas 2018-02-12 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/84270 * frontend-passes (scalarized_expr): If the expression is an assumed size array, leave in the last reference and pass AR_SECTION instead of AR_FULL to gfc_resolve in order to avoid an error. 2018-02-12 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/84270 * gfortran.dg/inline_matmul_22.f90: New test.
Index: frontend-passes.c =================================================================== --- frontend-passes.c (Revision 257347) +++ frontend-passes.c (Arbeitskopie) @@ -3567,11 +3567,27 @@ scalarized_expr (gfc_expr *e_in, gfc_expr **index, is the lbound of a full ref. */ int j; gfc_array_ref *ar; + int to; ar = &ref->u.ar; - ar->type = AR_FULL; - for (j = 0; j < ar->dimen; j++) + + /* For assumed size, we need to keep around the final + reference in order not to get an error on resolution + below, and we cannot use AR_FULL. */ + + if (ar->as->type == AS_ASSUMED_SIZE) { + ar->type = AR_SECTION; + to = ar->dimen - 1; + } + else + { + to = ar->dimen; + ar->type = AR_FULL; + } + + for (j = 0; j < to; j++) + { gfc_free_expr (ar->start[j]); ar->start[j] = NULL; gfc_free_expr (ar->end[j]);
! { dg-do compile } ! { dg-additional-options "-ffrontend-optimize" } ! PR 84270 - this used to be rejected. ! Test case by Michael Weinert module fp_precision integer, parameter :: fp = selected_real_kind(13) end module fp_precision subroutine lhcal(nrot,orth,ngpts,vgauss,vr_0) use fp_precision ! floating point precision implicit none !---> rotation matrices and rotations (input) integer, intent(in) :: nrot ! real(kind=fp), intent(in) :: orth(3,3,nrot) ! fine at all -O real(kind=fp), intent(in) :: orth(3,3,*) !---> gaussian integration points integer, intent(in) :: ngpts real(kind=fp), intent(in) :: vgauss(3,*) !---> output results real(kind=fp), intent(out) :: vr_0(3) real(kind=fp) :: v(3),vr(3) integer :: n,nn vr_0 = 0 do nn=1,ngpts v(:) = vgauss(:,nn) !---> apply rotations do n=2,nrot vr = matmul( orth(:,:,n), v ) vr_0 = vr_0 + vr enddo enddo return end subroutine lhcal