我有一个奇怪的问题:在编译优化时对子程序的可选参数发出警告。但是,如果该可选参数是子例程的唯一参数,则不会发出警告。为了说明,我在下面的示例代码中有两个小模块test1
和test2
在同一个文件t3.f90中。 test1
定义子例程foo1
,test2
定义子例程foo2
。 foo1
有2个参数,一个是强制参数,一个是可选参数。 foo2
只有可选参数。 foo1
和foo2
之间的差异是强制性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
时收到相同的警告。这就是为什么我认为警告确实与我的变量有关。
答案 0 :(得分:0)
问题似乎与gcc 4.8.2(可能还有版本)有关。我只是访问gcc 4.9.1并且两种情况都没有警告。