Ошибка сегментации при связывании необязательного размещаемого массива с необязательным нераспределяемым фиктивным аргументом - PullRequest
1 голос
/ 07 марта 2020

Следующий код Fortran генерирует ошибку сегментации при компиляции с версией ifort 19.0.3.199 без оптимизации (-O0) на SLES 15:

program test_prg
  call sub1()

contains

  subroutine sub1(opt)
    integer, allocatable, optional :: opt(:)
    call sub2(opt)
  end subroutine

  subroutine sub2(opt)
    integer, optional :: opt(:)
  end subroutine

end program

Я не собираюсь выделять opt в пределах sub2, поэтому я не указал allocatable атрибут там. Если я сделаю его размещаемым в обеих подпрограммах или не обязательно, или если я передам фактический аргумент в вызове sub1, тогда код завершится без ошибок. Тот же код также отлично работает при компиляции с gfortran из g cc версии 8.3.0 20190222.

Это ошибка компилятора или я что-то здесь не так делаю?

1 Ответ

4 голосов
/ 07 марта 2020

Fortran 2018 запрещает использование opt в sub1. Ограничения на наличие необязательных необязательных аргументов включают (15.5.2.12):

Необязательный необязательный аргумент, который отсутствует, подчиняется следующим ограничениям:

...

(8) Если он является размещаемым, он не должен быть распределен, освобожден или предоставлен как фактический аргумент, соответствующий необязательному нераспределенному фиктивному аргументу.

...