https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97242
Bug ID: 97242 Summary: Pointer assignment: Noncontiguous target to contiguous pointer wrongly accepted. Product: gcc Version: 11.0 Status: UNCONFIRMED Keywords: accepts-invalid Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: burnus at gcc dot gnu.org Target Milestone: --- 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