根据 Intel 编译器,Fortran 内部突然写入错误

Fortran internal write suddenly an error according to Intel compiler

我正在处理的 Fortran 代码有几行类似于

WRITE(filename, '(A16,"_",I4,".dat")') filename, indx

此代码已在许多不同平台和几乎所有主要编译器上成功编译 运行 数百次。但是突然间最新的(或者,无论如何,新的)英特尔编译器不喜欢它。它给出警告信息 "forrtl: .... Internal file write-to-self; undefined results"。此行执行后,原本合理的字符数组"filename"变为空白。

我想问题是 filename 既是写入的输入又是内部写入的目的地。修复很容易。它可以将 filename 替换为 filename_tmp 之类的目标。但正如我所说,直到现在才需要这样做。

所以我想知道,文件名作为输入和目标是否违反了Fortran标准,但是这些年所有编译器都对它视而不见,现在英特尔越来越严格了?还是英特尔在“势利”?还是彻头彻尾的越野车?

问题的write语句的执行1一直被明确禁止。

我们目前看到(F2018 12.6.4.5.1 p7):

During the execution of an output statement that specifies an internal file, no part of that internal file shall be referenced, defined, or become undefined as the result of evaluating any output list item.

filename 是一个内部文件,输出列表项的计算 filename 是对该内部文件的引用。

这不是编译器需要检测的编程违规,因此您可以根据需要将其视为编译器的改进诊断 capability/pickiness 的一个案例。编译器的这种行为的变化不会损害 Fortran 程序。

Fortran 66 没有内部文件(或字符类型),当然,Fortrans 77、90 和 95 使用不同的词来实现相同的效果(例如,参见 F90 9.4.4):

If an internal file has been specified, an input/output list item must not be in the file or associated with the file.

如果这看起来更严格,从 Fortran 2003 开始​​,输入和输出语句的限制分别说明(上面只引用了输出,p8 用于输入)。


1注意execution的使用:语句本身作为语句没有错。它允许存在于未到达的源代码中。编译的时候查这个语句可不是简单的事情