The lines: P => B(i)%A(:,::3,::4) ! <<< P => C(::2,::2,::2) ! <<< are wrongly accepted – although the compiler can know that it is invalid → gfc_is_not_contiguous() should detect this. -------------- implicit none type t integer, allocatable :: A(:,:,:) 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) ! <<< P => C(::2,::2,::2) ! <<< ! 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
FIXED – but the git-hook script did not add the commit :-( r11-3556-g65167982efa4dbb96698d026e6d7e17acb513f0a commit 65167982efa4dbb96698d026e6d7e17acb513f0a Author: Tobias Burnus <tobias@codesourcery.com> Date: Wed Sep 30 15:01:13 2020 +0200 Fortran: add contiguous check for ptr assignment, fix non-contig check (PR97242) gcc/fortran/ChangeLog: PR fortran/97242 * expr.c (gfc_is_not_contiguous): Fix check. (gfc_check_pointer_assign): Use it. gcc/testsuite/ChangeLog: PR fortran/97242 * gfortran.dg/contiguous_11.f90: New test. * gfortran.dg/contiguous_4.f90: Update. * gfortran.dg/contiguous_7.f90: Update.