如果它是子例程的唯一arg,则对可选arg的警告消失

时间:2016-01-13 18:48:37

标签: gcc fortran gfortran compiler-flags

我有一个奇怪的问题:在编译优化时对子程序的可选参数发出警告。但是,如果该可选参数是子例程的唯一参数,则不会发出警告。为了说明,我在下面的示例代码中有两个小模块test1test2在同一个文件t3.f90中。 test1定义子例程foo1test2定义子例程foo2foo1有2个参数,一个是强制参数,一个是可选参数。 foo2只有可选参数。 foo1foo2之间的差异是强制性arg以及该强制性arg的打印。

module test1

contains
    !
    subroutine foo1(a, t)
        integer, intent(in) :: a
        integer , dimension(:), intent(in out), optional :: t
        !
        print*, a! actually, do something with a
        if(present(t))then
            t = 1!.true.
        end if
    end subroutine foo1
    !
end module test1


module test2

contains
    !
    subroutine foo2(t)
        integer , dimension(:), intent(in out), optional :: t
        !
        if(present(t))then
            t = 1 !actually, 1 is replace by a function call
        end if
    end subroutine foo2
    !
end module test2

我将代码放在文件t3.f90中并编译如下

  
    

$ gfortran -Wall -O1 -c t3.f90
    t3.f90:在函数'foo1'中:
    t3.f90:5:0:警告:'t.0'可以在此函数中未初始化使用[-Wyybe-uninitialized]
    子程序foo1(a,t)

  

我对foo2没有同样的警告,这很奇怪。如果我删除优化标记,警告就会消失。

我正在使用gfortran 4.8.2。这是一个错误还是我对某些事情的误解?如果它是一个bug,它是否在较新的版本中解决了?

从VladimirF和francescalus的输入中,我发现为那些熟悉GCC内部的人添加以下细节很有用。 如果我将名称t更改为xxx名称,则会在t.0替换为xxx.0时收到相同的警告。这就是为什么我认为警告确实与我的变量有关。

1 个答案:

答案 0 :(得分:0)

问题似乎与gcc 4.8.2(可能还有版本)有关。我只是访问gcc 4.9.1并且两种情况都没有警告。