Я заметил странную ошибку компоновки с 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» при финализации, потому что «des» в «cmp»имеет деструктор, который выписывает свой член 'i', который был установлен на 3.
В gfortran компилятор выдает ошибку, что деструктор составного типа не определен.Этот деструктор должен автоматически генерироваться и вызывать деструкторы всех членов.Проблема состоит в том, что в составном типе также есть член типа без деструктора.И это как-то мешает gfortran с организацией деструкторов.
Эта проблема решается путем размещения разрушаемого элемента после неразрушимого элемента (переключение двух строк внутри определения типа соединения).
Кто-нибудь знает, если это проблема компилятора, которая может быть решена в более поздних версиях, или я делаю что-то не так, и ifort как-то исправляет это для меня.Я всегда знал, что порядок, в котором определяются переменные-члены, не должен иметь значения.
Для тех, кто сталкивается с одной и той же проблемой: «Всегда ставьте свои разрушаемые элементы в конце».Однако непроизводные типы, похоже, не имеют значения, даже если они могут быть размещены.