! { 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)) STOP 1 if (.not. allocated (xa%i)) STOP 2 if (xa%i /= 5) STOP 3 xa%i = -3 call suba(xa, alloc=.true., prsnt=.true.) if (allocated (xa)) STOP 4 call suba2(alloc=.false., prsnt=.false.) call suba2(xa2, alloc=.false., prsnt=.true.) if (.not. allocated (xa2)) STOP 5 if (size (xa2) /= 1) STOP 6 if (.not. allocated (xa2(1)%i)) STOP 7 if (xa2(1)%i /= 5) STOP 8 xa2(1)%i = -3 call suba2(xa2, alloc=.true., prsnt=.true.) if (allocated (xa2)) STOP 9 call subp(alloc=.false., prsnt=.false.) call subp(xp, alloc=.false., prsnt=.true.) if (.not. associated (xp)) STOP 10 if (.not. allocated (xp%i)) STOP 11 if (xp%i /= 5) STOP 12 xp%i = -3 call subp(xp, alloc=.true., prsnt=.true.) if (associated (xp)) STOP 13 call subp2(alloc=.false., prsnt=.false.) call subp2(xp2, alloc=.false., prsnt=.true.) if (.not. associated (xp2)) STOP 14 if (size (xp2) /= 1) STOP 15 if (.not. allocated (xp2(1)%i)) STOP 16 if (xp2(1)%i /= 5) STOP 17 xp2(1)%i = -3 call subp2(xp2, alloc=.true., prsnt=.true.) if (associated (xp2)) STOP 18 call subac(alloc=.false., prsnt=.false.) call subac(xac, alloc=.false., prsnt=.true.) if (.not. allocated (xac)) STOP 19 if (.not. allocated (xac%i)) STOP 20 if (xac%i /= 5) STOP 21 xac%i = -3 call subac(xac, alloc=.true., prsnt=.true.) if (allocated (xac)) STOP 22 call suba2c(alloc=.false., prsnt=.false.) call suba2c(xa2c, alloc=.false., prsnt=.true.) if (.not. allocated (xa2c)) STOP 23 if (size (xa2c) /= 1) STOP 24 if (.not. allocated (xa2c(1)%i)) STOP 25 if (xa2c(1)%i /= 5) STOP 26 xa2c(1)%i = -3 call suba2c(xa2c, alloc=.true., prsnt=.true.) if (allocated (xa2c)) STOP 27 contains subroutine suba2c(x, prsnt, alloc) class(t), optional, allocatable :: x(:)[:] logical prsnt, alloc if (present (x) .neqv. prsnt) STOP 28 if (prsnt) then if (alloc .neqv. allocated(x)) STOP 29 if (.not. allocated (x)) then allocate (x(1)[*]) x(1)%i = 5 else if (x(1)%i /= -3) STOP 30 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) STOP 31 if (present (x)) then if (alloc .neqv. allocated(x)) STOP 32 if (.not. allocated (x)) then allocate (x[*]) x%i = 5 else if (x%i /= -3) STOP 33 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) STOP 34 if (prsnt) then if (alloc .neqv. allocated(x)) STOP 35 if (.not. allocated (x)) then allocate (x(1)) x(1)%i = 5 else if (x(1)%i /= -3) STOP 36 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) STOP 37 if (present (x)) then if (alloc .neqv. allocated(x)) STOP 38 if (.not. allocated (x)) then allocate (x) x%i = 5 else if (x%i /= -3) STOP 39 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) STOP 40 if (present (x)) then if (alloc .neqv. associated(x)) STOP 41 if (.not. associated (x)) then allocate (x(1)) x(1)%i = 5 else if (x(1)%i /= -3) STOP 42 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) STOP 43 if (present (x)) then if (alloc .neqv. associated(x)) STOP 44 if (.not. associated (x)) then allocate (x) x%i = 5 else if (x%i /= -3) STOP 45 deallocate (x) end if end if end subroutine subp end