! { dg-do run } program alloc_comp type t integer, pointer :: z end type type(t), save :: obj[*] integer, allocatable, target :: i[:] if (associated(obj%z)) error stop "'z' should not be associated yet." allocate (obj%z) call f(obj) if (associated(obj%z)) error stop "'z' should not be associated anymore." allocate(i[*], SOURCE=42) obj%z => i if (.not. allocated(i)) error stop "'i' no longer allocated." i = 15 if (obj%z /= 15) error stop "'obj%z' is deep copy and not pointer." nullify (obj%z) if (.not. allocated(i)) error stop "'i' should still be allocated." if (associated(obj%z)) error stop "'obj%z' should not be associated anymore." obj%z => i call f(obj) ! One can not say anything about i here. The memory should be deallocated, but ! the pointer in i is still set. if (associated(obj%z)) error stop "'obj%z' should not be associated anymore." contains subroutine f(x) type(t) :: x[*] if ( associated(x%z) ) deallocate(x%z) end subroutine end program