Dear PGI maintainers,
it seems that pgfortran compiled binaries fail to call destructors on intent(out) actual arguments. Given the example below, the finalizer is never called, although it should be as the actual argument is overwritten with a default initialized one.
module typedef
implicit none
type :: MyType
integer :: status = 0
contains
final :: MyType_destruct
end type MyType
contains
subroutine MyType_destruct(this)
type(MyType), intent(inout) :: this
print *, 'MyType_destruct: ', this%status
this%status = -1
end subroutine MyType_destruct
subroutine createMyType(inst)
type(MyType), intent(out) :: inst
print *, 'createMyType: ', inst%status
inst%status = 1
end subroutine createMyType
end module typedef
program test
use typedef
implicit none
type(MyType) :: inst
inst%status = 2
call createMyType(inst)
print *, 'main program: ', inst%status
end program test
Using pgfortran 17.10, I obtain for the code above the output
createMyType: 0
main program: 1
while the expected one would be:
MyType_destruct: 2
createMyType: 0
main program: 1
Failing to call the destructor can lead to serious memory leakage, if the derived type encompasses a resource (e.g. an allocated pointer) much must be freed if the derived type instance goes out of scope.
Best regards,
Bálint