| ! { dg-do run } |
| ! PR 56789 - packing / unpacking of contiguous arguments |
| ! did not happen. |
| |
| module my_module |
| implicit none |
| contains |
| subroutine cont_arg(a) |
| real, contiguous :: a(:,:) |
| integer :: i,j |
| do j=1,size(a,2) |
| do i=1,size(a,1) |
| a(i,j) = i+10*j |
| end do |
| end do |
| end subroutine cont_arg |
| subroutine cont_pointer_arg (a) |
| integer, pointer, contiguous :: a(:) |
| call assumed_size(a) |
| call assumed_size(a(::1)) |
| call assumed_size_2(a(::2)) |
| end subroutine cont_pointer_arg |
| |
| subroutine assumed_size(y) |
| integer, dimension(*) :: y |
| if (y(2) /= 2 .or. y(3) /= 3 .or. y(4) /= 4 .or. y(5) /= 5 .or. y(6) /= 6) & |
| stop 2 |
| end subroutine assumed_size |
| |
| subroutine assumed_size_2(y) |
| integer, dimension(*) :: y |
| if (y(1) /= 1 .or. y(2) /= 3 .or. y(3) /= 5) stop 3 |
| end subroutine assumed_size_2 |
| |
| subroutine cont_assumed_shape(x) |
| integer, dimension(:), contiguous :: x |
| if (size(x,1) == 8) then |
| if (any(x /= [1,2,3,4,5,6,7,8])) stop 4 |
| else |
| if (any(x /= [1,3,5,7])) stop 5 |
| end if |
| end subroutine cont_assumed_shape |
| end module my_module |
| |
| program main |
| use my_module |
| implicit none |
| real, dimension(5,5) :: a |
| real, dimension(5,5) :: res |
| integer, dimension(8), target :: t |
| integer, dimension(:), pointer, contiguous :: p |
| res = reshape([11., 1.,12., 1.,13.,& |
| 1., 1., 1., 1., 1.,& |
| 21., 1.,22., 1.,23.,& |
| 1., 1., 1., 1., 1.,& |
| 31., 1.,32., 1., 33.], shape(res)) |
| a = 1. |
| call cont_arg(a(1:5:2,1:5:2)) |
| if (any(a /= res)) stop 1 |
| t = [1,2,3,4,5,6,7,8] |
| p => t |
| call cont_pointer_arg(p) |
| call cont_assumed_shape (t) |
| call cont_assumed_shape (t(::2)) |
| end program main |