Hi,
I want to discuss a case/bug where the return of a function is not properly deallocated when it is declared class. When return as type everything is clean. There is no need for an assignment and final subroutine but it help see what happens.
It seems to me also that the compiler should complain about the intrisic class copy when the assignment is not available, but it figures the copy correctly, but after fails to deallocate the temporary object as you can see when compare output with type and class.
Is it possible to avoid the additional copy from the temporary object into sm, and directly use sm as recipient for the output function ? I know this is the behavior when using a subroutine.
module tata implicit none type bar integer, allocatable :: ia(:), ja(:) contains final:: destroy procedure,pass :: copy generic,public :: assignment(=) => copy end type contains subroutine copy(t2,t1) class(bar),intent(in) :: t1 class(bar),intent(out) :: t2 print *,'copy class' allocate(t2%ia(size(t1%ia)) ,source=t1%ia) allocate(t2%ja(size(t1%ja)) ,source=t1%ja) end subroutine function assign1(t1) result(t2) class(bar),intent(in) :: t1 class(bar),allocatable :: t2 allocate(t2) allocate(t2%ia(size(t1%ia)) ,source=t1%ia) allocate(t2%ja(size(t1%ja)) ,source=t1%ja) end function subroutine destroy(this) type(bar) :: this if(allocated(this%ia)) then deallocate(this%ia,this%ja) print *,'destroy class' else print *,'destroy empty class' end if end subroutine subroutine toto type(bar), allocatable :: sm,sm2 integer :: i allocate(sm) allocate(sm2) allocate(sm%ia(100),sm%ja(100)) allocate(sm2%ia(1000),sm2%ja(1000)) do i=1,2 deallocate(sm) allocate(sm) sm=assign1(sm2) end do deallocate(sm2) end subroutine end module program testmv3 use tata implicit none call toto() end program testmv3
With class :
destroy class destroy empty class copy class
With type :
destroy class destroy empty class copy class destroy class