Gfortran деструктор членов - PullRequest
0 голосов
/ 04 октября 2018

Я заметил странную ошибку компоновки с 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 как-то исправляет это для меня.Я всегда знал, что порядок, в котором определяются переменные-члены, не должен иметь значения.

Для тех, кто сталкивается с одной и той же проблемой: «Всегда ставьте свои разрушаемые элементы в конце».Однако непроизводные типы, похоже, не имеют значения, даже если они могут быть размещены.

1 Ответ

0 голосов
/ 04 октября 2018

Скорее всего, ошибка 58175 , исправлена ​​в GCC 7. Исправьте GCC.Я могу подтвердить, что ваш код компилируется в этой версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...