gfortran成员的析构函数

时间:2018-10-04 10:11:06

标签: fortran gfortran derived-types

我注意到与gfortran(GNU Fortran(Debian 4.9.2-10)4.9.2)发生奇怪的链接错误,这取决于我在派生类型中定义成员的顺序。使用ifort(ifort(IFORT)18.0.1 20171018),代码可以按预期方式编译和运行。

module bug

  implicit none
  type indestructable
    integer :: i
  end type
  type destructable
    integer :: i
  contains
    final :: destruct
  end type destructable

  type compound
    type(destructable) :: des
    type(indestructable) :: ind
  end type compound

contains

  subroutine destruct(instance)

    type(destructable), intent(in) :: instance
    write(*,*) instance%i

  end subroutine destruct

  subroutine run

    type(compound) :: cmp

    cmp%des%i = 3
    cmp%ind%i = 4

  end subroutine run

end module bug

program main
  use bug, only: run
  implicit none
  call run
end program main

该程序在完成时应打印出“ 3”,因为“ cmp”中的“ des”具有一个析构函数,该析构函数会写出其成员“ i”,该成员设置为3。

在gfortran中,编译器给出一个错误,即未定义复合类型的析构函数。该析构函数应自动生成,并调用所有成员的析构函数。问题在于复合类型中还有一个没有析构函数的类型的成员。从而以某种方式妨碍gfortran破坏者的组织。

通过将可破坏成员放在不可破坏成员之后(在化合物的类型定义内切换两行)来解决此问题。

有人知道这是否是在以后的版本中可以解决的编译器问题,还是我做错了什么,而ifort则以某种方式为我解决了这个问题。我一直了解到,定义成员变量的顺序无关紧要。

对于遇到相同问题的任何人:“始终将可破坏的成员放在最后”。但是,即使非派生类型都是可分配的,它们似乎也不重要。

1 个答案:

答案 0 :(得分:2)

这很可能是bug 58175,已在GCC 7中解决。更新了GCC。我可以确认您的代码可以在此版本中编译。