Fortran不会在数组或程序变量上调用FINAL

时间:2018-10-29 13:25:52

标签: fortran destructor gfortran intel-fortran

我有一个类型,该类型的例程具有FINAL属性:

module m_test

   type t_test
      integer :: a
   contains
      final free
   end type t_test

contains
   subroutine free(h)
      implicit none

      type(t_test) :: h
      write (*,*) 'close: ', h%a
   end subroutine free
end module m_test

subroutine no_free_call()
   use m_test
   implicit none
   type(t_test) :: h(3)

   h(1)%a = 2
end subroutine no_free_call

subroutine free_call()
   use m_test
   implicit none
   type(t_test) :: h

   h%a = 3
end subroutine free_call


program main
   use m_test
   implicit none

   type(t_test) :: h

   call no_free_call()
   call free_call()

   h%a = 1
end program main

这是它的输出:

 close:            3

与gfortran 8.2.0和ifort 18.0.1 20171018相同。

如您所见,如果标记为FINAL的例程是子例程中的标量,则调用该例程,但如果满足以下条件,则不会调用

  • 它们是program main部分的标量
  • 它们位于超出范围的子例程的静态数组中
  • 它们位于超出范围的可分配数组中
  • 它们处于可分配的数组中,被释放掉

这毫无意义。这是编译器错误还是标准的fortran?有什么办法解决这个问题?

0 个答案:

没有答案