+2018-02-17 Thomas Koenig <tkoenig@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-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/84115
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;
--- /dev/null
+! { 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