这是英特尔 Fortran 编译器中的错误吗?

Is this a bug in the Intel Fortran compiler?

提问人:Rasmus 提问时间:9/15/2023 最后编辑:Rasmus 更新时间:9/15/2023 访问量:105

问:

我通过举一个最小的例子,重现了使用英特尔 Fortran 编译器 ifort 编译代码时遇到的一些奇怪行为。这种奇怪的行为也出现在较新的英特尔编译器 ifx 上。

使用 ifort 版本 2021.10.0 或 ifx 版本 2023.2.0 编译以下代码。

ifort minimal_example.f90

ifx minimal_example.f90

minimal_example.f90

subroutine f(n)
    implicit none
    integer,  intent(in) :: n
    real :: x(n)
    real :: y(n)
    real :: z(n)
    call g(z, y)

contains
    
    subroutine g(z, y)
        real, intent(in)  :: z(size(x))
        real, intent(out) :: y(n)
        print*, 'n       = ', n
        print*, 'size(y) = ', size(y)
    end subroutine
    
end subroutine
        

program minimal_example
    implicit none
    external f
    call f(8)
end program

我得到输出:

 n       =            8
 size(y) =            0

使用 gfortran,我得到:

 n       =            8
 size(y) =            8

这是两个英特尔 Fortran 编译器中的错误吗?

如果我用 n 替换 size(x),奇怪的行为就会消失。但我认为使用 size(x) 应该是有效的。

Fortran 英特尔 Fortran 编译器错误

评论

0赞 francescalus 9/15/2023
你已经确定了一个完全合理的解决方法,那么除了“是”之外,你还追求什么样的答案?您是否担心某个特定部分可能无效 Fortran?
0赞 Rasmus 9/15/2023
我应该向英特尔报告吗?
0赞 Rasmus 9/15/2023
顺便说一句,另一种解决方法是交换 g 中虚拟参数的顺序。这些真的是好的解决方法还是来自错误的未定义行为?
1赞 Steve Lionel 9/16/2023
不,不是。但是编译器非常复杂,通常看不到的用法可能会触发错误。在 community.intel.com/t5/Intel-Fortran-Compiler/bd-p/ 举报...
1赞 francescalus 9/16/2023
我不得不不同意@SteveLionel的观点:Fortran 是一种非常复杂的语言,我怀疑有一个编译器既有用又没有错误。如果您在英特尔(或其他)编译器中发现了某个错误,那么您很幸运/不幸,但是在多年的 Fortran 开发过程中,很难不做一些疯狂的事情来发现一个编译器供应商的内部测试套件未涵盖的情况。(我没有统计我报告了多少错误。

答: 暂无答案