如果可选 arg 是子例程的唯一 arg,则警告消失
Warning on an optional arg disapears if it is the only arg of the subroutine
我有一个奇怪的问题:在启用优化的情况下编译时,子程序的可选参数出现警告。但是,如果该可选参数是子例程的唯一参数,则不会发出警告。为了说明,我有下面的示例代码,两个小模块 test1
和 test2
在同一个文件 t3.f90 中。 test1
定义子程序foo1
,test2
定义子程序foo2
。 foo1
有2个参数,一个必须的,一个可选的。 foo2
只有可选参数。 foo1
和 foo2
之间的区别在于强制性 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.0
被 xxx.0
替换。这就是为什么我认为警告确实与我的变量有关。
问题似乎与 gcc 4.8.2(可能与以下版本)有关。我刚刚获得了 gcc 4.9.1 的访问权,但在这两种情况下都没有警告。
我有一个奇怪的问题:在启用优化的情况下编译时,子程序的可选参数出现警告。但是,如果该可选参数是子例程的唯一参数,则不会发出警告。为了说明,我有下面的示例代码,两个小模块 test1
和 test2
在同一个文件 t3.f90 中。 test1
定义子程序foo1
,test2
定义子程序foo2
。 foo1
有2个参数,一个必须的,一个可选的。 foo2
只有可选参数。 foo1
和 foo2
之间的区别在于强制性 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.0
被 xxx.0
替换。这就是为什么我认为警告确实与我的变量有关。
问题似乎与 gcc 4.8.2(可能与以下版本)有关。我刚刚获得了 gcc 4.9.1 的访问权,但在这两种情况下都没有警告。