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

Reply via email to