! { dg-do compile } ! ! PR fortran/97242 ! implicit none type t integer, allocatable :: A(:,:,:) integer :: D(5,5,5) end type t type(t), target :: B(5) integer, pointer, contiguous :: P(:,:,:) integer, target :: C(5,5,5) integer :: i i = 1 ! OK: contiguous P => B(i)%A P => B(i)%A(:,:,:) P => C P => C(:,:,:) call foo (B(i)%A) call foo (B(i)%A(:,:,:)) call foo (C) call foo (C(:,:,:)) ! Invalid - not contiguous ! "If the pointer object has the CONTIGUOUS attribute, the pointer target shall be contiguous." ! → known to be noncontigous (not always checkable, however) P => B(i)%A(:,::3,::4) ! <<< Unknown as (1:2:3,1:3:4) is contiguous and has one element. P => B(i)%D(:,::2,::2) ! { dg-error "Assignment to contiguous pointer from non-contiguous target" } P => C(::2,::2,::2) ! { dg-error "Assignment to contiguous pointer from non-contiguous target" } ! This following is stricter: ! C1541 The actual argument corresponding to a dummy pointer with the ! CONTIGUOUS attribute shall be simply contiguous (9.5.4). call foo (B(i)%A(:,::3,::4)) ! { dg-error "must be simply contiguous" } call foo (C(::2,::2,::2)) ! { dg-error "must be simply contiguous" } contains subroutine foo(Q) integer, pointer, intent(in), contiguous :: Q(:,:,:) end subroutine foo end