Follow up to PR 41907. ---------------- module m contains subroutine one(a) real, dimension(:,:), intent(inout) :: a call two(a) end subroutine one subroutine two(a) real, dimension(:,:), intent(inout) :: a end subroutine two end module ----------------
As both "one" and "two" have a assumed-shape argument (deferred shape would be the same), there is absolutely no reason to copy the array descriptor. But gfortran does so: a.0 = (real(kind=4)[0:D.1405] * restrict) a->data; parm.6.data = (void *) &(*a.0)[0]; two (&parm.6); For assume-size/explicit-size arrays, gfortran does do it correctly. Also for deferred-size arrays. It also works with allocatable components, e.g call two(t%a) where "a" is "allocatable, dimension(:)". -- Summary: Unnecessary copying of array descriptors Product: gcc Version: 4.5.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: fortran AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: burnus at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41911