| ! { 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 |
| |