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

Warning on an optional arg disapears if it is the only arg of the subroutine

我有一个奇怪的问题:在启用优化的情况下编译时,子程序的可选参数出现警告。但是,如果该可选参数是子例程的唯一参数,则不会发出警告。为了说明,我有下面的示例代码,两个小模块 test1test2 在同一个文件 t3.f90 中。 test1定义子程序foo1test2定义子程序foo2foo1 有2个参数,一个必须的,一个可选的。 foo2 只有可选参数。 foo1foo2 之间的区别在于强制性 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: In function 'foo1':
t3.f90:5:0: warning: 't.0' may be used uninitialized in this function [-Wmaybe-uninitialized]
subroutine foo1(a, t)

很奇怪我没有和foo2一样的警告。如果我删除优化标志,警告就会消失。

我正在使用 gfortran 4.8.2。这是错误还是我对某事的误解?如果是BUG,新版本解决了吗?


根据 VladimirF 和 francescalus 的意见,我发现为熟悉 GCC 内部结构的人添加以下详细信息很有用。 如果我将名称 t 更改为任何名称 xxx,我会收到相同的警告,其中 t.0xxx.0 替换。这就是为什么我认为警告确实与我的变量有关。

问题似乎与 gcc 4.8.2(可能与以下版本)有关。我刚刚获得了 gcc 4.9.1 的访问权,但在这两种情况下都没有警告。