blob: 2b408dbda05c8e8595aac6a116790d93c5afada1 [file] [log] [blame]
! { dg-do run }
! { dg-options "-fcoarray=single" }
!
! PR fortran/50981
! PR fortran/54618
!
implicit none
type t
integer, allocatable :: i
end type t
type, extends (t):: t2
integer, allocatable :: j
end type t2
class(t), allocatable :: xa, xa2(:), xac[:], xa2c(:)[:]
class(t), pointer :: xp, xp2(:)
xp => null()
xp2 => null()
call suba(alloc=.false., prsnt=.false.)
call suba(xa, alloc=.false., prsnt=.true.)
if (.not. allocated (xa)) call abort ()
if (.not. allocated (xa%i)) call abort ()
if (xa%i /= 5) call abort ()
xa%i = -3
call suba(xa, alloc=.true., prsnt=.true.)
if (allocated (xa)) call abort ()
call suba2(alloc=.false., prsnt=.false.)
call suba2(xa2, alloc=.false., prsnt=.true.)
if (.not. allocated (xa2)) call abort ()
if (size (xa2) /= 1) call abort ()
if (.not. allocated (xa2(1)%i)) call abort ()
if (xa2(1)%i /= 5) call abort ()
xa2(1)%i = -3
call suba2(xa2, alloc=.true., prsnt=.true.)
if (allocated (xa2)) call abort ()
call subp(alloc=.false., prsnt=.false.)
call subp(xp, alloc=.false., prsnt=.true.)
if (.not. associated (xp)) call abort ()
if (.not. allocated (xp%i)) call abort ()
if (xp%i /= 5) call abort ()
xp%i = -3
call subp(xp, alloc=.true., prsnt=.true.)
if (associated (xp)) call abort ()
call subp2(alloc=.false., prsnt=.false.)
call subp2(xp2, alloc=.false., prsnt=.true.)
if (.not. associated (xp2)) call abort ()
if (size (xp2) /= 1) call abort ()
if (.not. allocated (xp2(1)%i)) call abort ()
if (xp2(1)%i /= 5) call abort ()
xp2(1)%i = -3
call subp2(xp2, alloc=.true., prsnt=.true.)
if (associated (xp2)) call abort ()
call subac(alloc=.false., prsnt=.false.)
call subac(xac, alloc=.false., prsnt=.true.)
if (.not. allocated (xac)) call abort ()
if (.not. allocated (xac%i)) call abort ()
if (xac%i /= 5) call abort ()
xac%i = -3
call subac(xac, alloc=.true., prsnt=.true.)
if (allocated (xac)) call abort ()
call suba2c(alloc=.false., prsnt=.false.)
call suba2c(xa2c, alloc=.false., prsnt=.true.)
if (.not. allocated (xa2c)) call abort ()
if (size (xa2c) /= 1) call abort ()
if (.not. allocated (xa2c(1)%i)) call abort ()
if (xa2c(1)%i /= 5) call abort ()
xa2c(1)%i = -3
call suba2c(xa2c, alloc=.true., prsnt=.true.)
if (allocated (xa2c)) call abort ()
contains
subroutine suba2c(x, prsnt, alloc)
class(t), optional, allocatable :: x(:)[:]
logical prsnt, alloc
if (present (x) .neqv. prsnt) call abort ()
if (prsnt) then
if (alloc .neqv. allocated(x)) call abort ()
if (.not. allocated (x)) then
allocate (x(1)[*])
x(1)%i = 5
else
if (x(1)%i /= -3) call abort()
deallocate (x)
end if
end if
end subroutine suba2c
subroutine subac(x, prsnt, alloc)
class(t), optional, allocatable :: x[:]
logical prsnt, alloc
if (present (x) .neqv. prsnt) call abort ()
if (present (x)) then
if (alloc .neqv. allocated(x)) call abort ()
if (.not. allocated (x)) then
allocate (x[*])
x%i = 5
else
if (x%i /= -3) call abort()
deallocate (x)
end if
end if
end subroutine subac
subroutine suba2(x, prsnt, alloc)
class(t), optional, allocatable :: x(:)
logical prsnt, alloc
if (present (x) .neqv. prsnt) call abort ()
if (prsnt) then
if (alloc .neqv. allocated(x)) call abort ()
if (.not. allocated (x)) then
allocate (x(1))
x(1)%i = 5
else
if (x(1)%i /= -3) call abort()
deallocate (x)
end if
end if
end subroutine suba2
subroutine suba(x, prsnt, alloc)
class(t), optional, allocatable :: x
logical prsnt, alloc
if (present (x) .neqv. prsnt) call abort ()
if (present (x)) then
if (alloc .neqv. allocated(x)) call abort ()
if (.not. allocated (x)) then
allocate (x)
x%i = 5
else
if (x%i /= -3) call abort()
deallocate (x)
end if
end if
end subroutine suba
subroutine subp2(x, prsnt, alloc)
class(t), optional, pointer :: x(:)
logical prsnt, alloc
if (present (x) .neqv. prsnt) call abort ()
if (present (x)) then
if (alloc .neqv. associated(x)) call abort ()
if (.not. associated (x)) then
allocate (x(1))
x(1)%i = 5
else
if (x(1)%i /= -3) call abort()
deallocate (x)
end if
end if
end subroutine subp2
subroutine subp(x, prsnt, alloc)
class(t), optional, pointer :: x
logical prsnt, alloc
if (present (x) .neqv. prsnt) call abort ()
if (present (x)) then
if (alloc .neqv. associated(x)) call abort ()
if (.not. associated (x)) then
allocate (x)
x%i = 5
else
if (x%i /= -3) call abort()
deallocate (x)
end if
end if
end subroutine subp
end