fortran - Fortran 中的 PGI 编译错误 : "forward reference to function"

标签 fortran pgi

我对 PGI Fortran 编译器有点困惑。

当我尝试使用 pgfortran 19.10 编译存储在名为 test.f90 的文件中的以下简单模块时,我收到了我不理解的错误。使用 gfortran 或 ifort 编译时运行良好。

文件test.f90:

MODULE CT
    IMPLICIT NONE
    integer, parameter :: si   = SELECTED_INT_KIND(4)
    integer(kind=si), public, parameter :: strlen   = 256


    type, public :: CMT
       integer (kind=si) :: nbTot 
       character(len=strlen), dimension(:), allocatable  :: condi 
    CONTAINS
       procedure :: find_line_condi 
    endtype CMT


 CONTAINS
    PURE function find_line_condi( table, cara ) result(k)
       IMPLICIT NONE
       class(CMT), intent(in)    :: table
       character(len=*), intent(in)  :: cara
       integer  (kind=si)   :: k
       integer  (kind=si)   :: j

       k=-1
       do j=1,table%nbTot
          if (trim(table%condi(j)) .eq. cara)  then
             k=j
             RETURN
          else if ( j == table%nbTot ) then
             k=-1
             RETURN
          endif
       enddo
    end function find_line_condi

END MODULE CT

使用 pgfortran -c test.f90 进行编译返回以下错误消息:

/opt/pgi/linux86-64-llvm/19.10/share/llvm/bin/llc: error: /opt/pgi/linux86-64-llvm/19.10/share/llvm/bin/llc: /tmp/pgfortranr2qeZBujkwvA.ll:23:77: error: invalid forward reference to function 'ct_find_line_condi_' with wrong type: expected 'i32 (i64*, i64*, i64*, i64)*' but was 'i16 (i64*, i64*, i64*, i64)*'
@ct$cmt$td$vft = global [1 x i8*] [i8* bitcast(i16 (i64*, i64*, i64*, i64)* @ct_find_line_condi_ to i8*)]

有人知道这个问题是从哪里来的吗?

最佳答案

这是编译器中的一个错误。考虑模块

MODULE CT
    IMPLICIT NONE

    type CMT
    CONTAINS
      procedure, nopass :: find_line_condi 
    endtype CMT

 CONTAINS
    function find_line_condi()
       integer(SELECTED_INT_KIND(4)) find_line_condi
       find_line_condi=0
    end function find_line_condi

END MODULE CT

这比那个问题简单得多。用 pgfortran 19.10 编译有类似的乱码输出。留给读者/PGI 支持台的一个练习是,这个更简单的代码是否有效的 Fortran 应该被接受,但我认为 PGI 更愿意避免糟糕的诊断。

但是,这似乎是 PGI 的 LLVM 前端的一个弱点:请考虑使用 pgfortran -c -Mnollvm ... 进行编译。还有一些方法可以重写代码来尝试解决此错误,例如更改函数结果的类型。


更广泛地说,PGI introduced 2019 年发布了 LLVM 代码生成器。这似乎经历了一些teething difficulties 。如果您的代码在 PGI 2019 中意外失败(可能在 2018 中有效),那么使用 -Mnollvm 进行编译以使用非 LLVM 生成器值得一试。

关于fortran - Fortran 中的 PGI 编译错误 : "forward reference to function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59294996/

相关文章:

opencv - 如何在Windows中使用PGI运行OpenACC + OpenCV?

fortran - 什么是假定长度字符函数结果,为什么要避免它?

c - 使用 OpenACC 并行化嵌套循环

python - 从 python 向 Fortran 传递变量会导致错误值

python - 在 C/C++、Python 或 Fortran 中编程时输入方程式的方法

cuda - 从 CUDA 文件调用 Fortran OpenACC。如何使用PGI进行编译?

C++ 应用程序在实例化 ofstream 对象时崩溃。

optimization - 使用-fast编译时,波特兰组FORTRAN pgf90程序失败,-fast -Mnounroll成功时,

macos - 运行 gfortran 时巨大的 fort.# 文件

c - 为什么在将复数从 fortran 传递到 c 时不能 printf