1

以下 Fortran 代码-O0在 SLES 15 上使用 ifort 版本 19.0.3.199 编译时会产生分段错误,而无需优化 ( ):

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属性。如果我让它在两个子例程中都可以分配或非可选,或者如果我在调用中传递一个实际参数,则代码完成而不会出错。当使用 gfortran 从 gcc 版本 8.3.0 20190222 编译时,相同的代码也可以正常运行。sub2allocatablesub1

它是编译器错误还是我在这里做非法的事情?

4

1 回答 1

4

Fortran 2018 禁止您使用optin sub1. 对不存在的可选虚拟参数的限制包括 (15.5.2.12):

不存在的可选虚拟参数受以下限制。

...

(8) 如果它是可分配的,则不应分配、解除分配或作为与可选的不可分配伪参数相对应的实际参数提供。

于 2020-03-06T23:00:07.050 回答