为什么ifort -warn会在接口不匹配时抛出所有错误?

nau*_*101 1 fortran compiler-errors compiler-warnings intel-fortran

这是一些示例代码:

! Author: Svetlana Tkachenko svetlana@members.fsf.org
! License: GPLv3 or later

subroutine myprint(var) 
!    integer :: var 
!    print *, 'Hi, my ', var 
end subroutine 

module testing 
   type triangle 
      integer :: point(3) 
   end type 
end module 

program main 
   use testing 
   type(triangle) :: mytriangle 
   mytriangle%point(1)=5 
   call myprint(mytriangle%point(1)) 
end program
Run Code Online (Sandbox Code Playgroud)

它工作正常ifort -c file.f90,但ifort -warn all -c file.f90导致错误:

blah.f90(4): warning #6717: This name has not been given an explicit type.   [VAR]
subroutine myprint(var) 
-------------------^
blah.f90(4): remark #7712: This variable has not been used.   [VAR]
subroutine myprint(var) 
-------------------^
blah.f90(19): error #6633: The type of the actual argument differs from the type of the dummy argument.   [POINT]
   call myprint(mytriangle%point(1)) 
---------------------------^
compilation aborted for blah.f90 (code 1)
Run Code Online (Sandbox Code Playgroud)

为什么会-warn all抛出错误?该手册页明确指出all 包含错误.

我知道我可以修复代码,但我正在尝试为遗留代码库设置测试套件,并且我希望能够在开始进行代码更改之前运行带有警告的编译测试.

fra*_*lus 5

该选项-warn all包括选项,-warn interfaces用于检查可以确定此类接口的外部过程的接口.这通常用于使用该选项编译的单独文件中的外部过程生成的接口-gen-interfaces.

正是此选项-warn interfaces负责出现错误消息.这可以检查外部子程序的接口,因为该子程序与引用它的程序在同一个文件中.你有两个选择,然后:

  • 将外部子例程放在一个不同的文件中,而不是用-gen-interfaces;
  • 不要用-warn interfaces.

对于后者,您可以使用

ifort -warn all -warn nointerfaces ...
Run Code Online (Sandbox Code Playgroud)

除了接口检查之外还有所有其他警告.

然而,优选的是具有匹配的接口.那么应该注意到这一点

subroutine myprint(var) 
!    integer :: var
end subroutine 
Run Code Online (Sandbox Code Playgroud)

subroutine myprint(var) 
     integer :: var
end subroutine 
Run Code Online (Sandbox Code Playgroud)

存在默认隐式类型规则时,两个非常不同的东西.它们可能具有相同的最终效果,没有可执行语句(等),但特征是完全不同的.