! { dg-do run } ! { dg-options "-Warray-temporaries" } ! PR 57023 ! This used to cause wrong packing because a(1:n,1:n) was ! assumed to be a full array. module mymod implicit none contains subroutine foo1(a,n) integer, dimension(n,n), intent(inout) :: a integer :: n n = n - 1 call baz(a(1:n,1:n),n) ! { dg-warning "array temporary" } end subroutine foo1 subroutine foo2(a,n) integer, dimension(n,n), intent(inout) :: a integer :: n call decrement(n) call baz(a(1:n,1:n),n) ! { dg-warning "array temporary" } end subroutine foo2 subroutine foo3(a,n) integer, dimension(n,n), intent(inout) :: a integer :: n, m m = n - 1 call baz(a(1:m,1:m),m) ! { dg-warning "array temporary" } end subroutine foo3 subroutine foo4(a,n) integer, dimension(n,n), intent(inout) :: a integer, intent(in) :: n a(1:n,1:n) = 1 end subroutine foo4 subroutine baz(a,n) integer, dimension(n,n), intent(inout) :: a integer, intent(in) :: n a = 1 end subroutine baz subroutine decrement(n) integer, intent(inout) :: n n = n - 1 end subroutine decrement end module mymod program main use mymod implicit none integer, dimension(5,5) :: a, b integer :: n b = 0 b(1:4,1:4) = 1 n = 5 a = 0 call foo1(a,n) if (any(a /= b)) STOP 1 n = 5 a = 0 call foo2(a,n) if (any(a /= b)) STOP 2 n = 5 a = 0 call foo3(a,n) if (any(a /= b)) STOP 3 n = 5 a = 0 call foo4(a,n) if (any(a /= 1)) STOP 4 end program main