Это похоже на проблему с последними подпрограммами, ведь удаление последней подпрограммы устраняет ошибку сегментации. Тем не менее, это один из примеров более широкого класса проблем в gfortran.
Для проблемы в gfortran это так.
В вашем случае у вас есть доступное решение: удалите последнюю подпрограмму, которая на самом деле не вызывается в любой момент. В более общих случаях это может быть не вариант. В любом случае нужно сообщить об этой ошибке сопровождающим G CC (особенно, если вы можете протестировать более поздние версии компилятора).
Почему я говорю об этой части более широкой проблемы? Давайте посмотрим на упрощение вашего кода:
type :: str_t
character, allocatable :: s
end type str_t
type :: dynamic_t
type(str_t), allocatable :: expr
end type dynamic_t
type(dynamic_t), allocatable :: dyna
allocate(dyna)
allocate(dyna%expr)
end
или
implicit none
type :: str_t
character, allocatable :: s
end type str_t
type :: static_t
type(str_t) :: expr
end type static_t
type(static_t), allocatable :: stat
allocate(stat)
end
Ни один из них не имеет финализации, но оба присутствуют (для меня) при сегментировании при запуске.
Если вы хотите увидеть связь между программой вопроса и этим ответом: это отложенная длина характер компонента s
, который является ключевым. В качестве скалярного компонента явной длины (выделяемого) приведенные выше примеры cra sh с завершением или без него; в качестве компонента отложенной длины финализация контролирует cra sh.