Fortran中的PGI编译错误:“函数的前向引用”

时间:2019-12-11 22:21:05

标签: 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*)]

有人知道这个问题的根源吗?

1 个答案:

答案 0 :(得分:4)

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

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支持部门来做练习,但应该接受,但我认为诊断不佳是PGI希望避免的事情。

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


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