1 概要
nAG Fortran コンパイラのリリース 7.2 は、主要なアップデートです。
以前のリリースからアップグレードするお客様は、このリリース用の新しいライセンスキーが必要です。
Kusari ライセンス管理についての詳細は、KLICENCE.txt
を参照してください。
2 リリース概要
リリース 7.2 は Fortran 2018 の全てをサポートしているため、デフォルトの言語レベルは現在 -f2018 になっています。
OpenMP 4.0 と 4.5 の部分的なサポートが 7.2 の初期リリースに含まれています。 2024年初頭には、これを完全サポートにアップグレードするアップデートが行われます。
3 互換性
3.1 リリース 7.1 との互換性
リリース 7.2 はリリース 7.1 と完全に互換性があります。3.2 リリース 7.0 との互換性
リリース 7.2 はリリース 7.0 と互換性がありますが、-C=calls オプションでコンパイルされたファイルは、 手続きポインタ引数を持つ手続きが含まれている場合、またはそのような手続きへの参照が含まれている場合に再コンパイルが必要です。3.3 リリース 6.2 との互換性
MacOSでは、-abi=32 を通じてアクセス可能だった 32 ビット ABI モードが削除されました。その結果、 64 ビットコンパイルのみがサポートされ、-abi= スイッチが完全に削除されました。この点を除けば、リリース 7.2 は共配列が使用されている場合や -C=calls オプションが 代替戻り値を持つサブルーチンに使用されている場合を除き、リリース 6.2 と完全に互換性があります。 これらの機能を使用しているプログラムは再コンパイルが必要です。
3.4 リリース 6.1 との互換性
HPF(High Performance Fortran)からの機能を使用するプログラム、例えばILEN
組み込み関数や HPF_LIBRARY
モジュールは、
もはやサポートされません。
Linux x86-64 上で非推奨とされていた -abi=64 オプションが撤回されました。 このオプションは、64ビットポインタを持つが、32ビットのオブジェクトサイズと添字算術を提供し、リリース 5.1 以前との互換性のために存在していました。
HPF サポートと非推奨オプションの撤回を除けば、nAG Fortran コンパイラのリリース 7.2 はリリース 6.1 と完全に互換性があります。
3.5 リリース 6.0 との互換性
HPF サポートと非推奨オプションの撤回を除けば、リリース 7.2 の nAG Fortran コンパイラはリリース 6.0 と互換性がありますが、パラメタ化派生型
の割り当て可能配列を使用するプログラムは再コンパイルが必要です(これはモジュール変数と仮引数にのみ影響します)。
3.6 リリース 5.3.1, 5.3 および 5.2 との互換性
HPF サポートと非推奨オプションの撤回を除けば、リリース 7.2 の nAG Fortran コンパイラはリリース 5.3.1 と完全に互換性があります。 Windows 上では、名前がドル記号 ($) で始まるモジュールや手続きは再コンパイルが必要です。
新しい パラメタ化派生型
機能を使用するプログラムでは、パラメタ化された派生型の多相変数を割り当て、解放、初期化、
またはコピーするプログラムのすべての部分がリリース 7.1 以降でコンパイルされることを強く推奨します。
3.7 リリース 5.1 との互換性
nAG Fortran コンパイラのリリース 7.2 は nAGWare f95 リリース 5.1 と互換性がありますが、次の例外があります:- HPF からの機能を使用するプログラムはサポートされません;
-
CLASS
キーワードを使用するプログラムやライブラリ、または拡張される型を含むものは再コンパイルが必要です; - Linux x86-64 でリリース 5.1 でコンパイルされた 64 ビットのプログラムとライブラリはバイナリ互換性がなく、再コンパイルが必要です。
4 新しい Fortran 2018 の機能
-
GENERIC
文は、総称引用仕様を宣言するための簡潔な方法を提供します。 その構文は以下の通りです:GENERIC
[ , access-spec ]::
generic-spec=>
procedure-name-listPUBLIC
またはPRIVATE
、 generic-spec は総称識別子(名前、ASSIGNMENT(=)
、OPERATOR(
op)
、または {READ
|WRITE
}(
{FORMATTED
|UNFORMATTED
})
)、 そして procedure-name-list は名前付き手続きのコンマ区切りリストです。access-spec は、
GENERIC
文がモジュールの仕様部分にある場合にのみ許可されます。 リスト内の各名前付き手続きは、明示的な引用仕様を持たなければなりません;つまり、内部手続き、モジュール手続きであるか、またはインターフェイスブロックまたは手続き宣言文で明示的なインターフェイスを指定して宣言されている必要があります。 手続きは、全てが関数または全てがサブルーチンであり、かつ明確であるという通常の総称規則を満たさなければなりません。オプションの access-spec を除いて、
GENERIC
文はINTERFACE generic-spec PROCEDURE procedure-name-list END INTERFACE
と同じ効果があります。 唯一の利点は、数行短く、同じ行でアクセシビリティを宣言できることです。 この構文は派生型定義の generic-binding と同じですが、名前のリストは型に結び付けられた手続きではなく通常の名前付き手続きです。例えば、プログラム
Module print_sqrt Private Generic,Public :: g => s1, s2 Contains Subroutine s1(x) Print '(F10.6)',Sqrt(x) End Subroutine Subroutine s2(n) Print '(I10)',Nint(Sqrt(Real(n))) End Subroutine End Module Program test Use print_sqrt Call g(2.0) Call g(127) End Program
は1.414214 11
を出力します。 -
E0
指数幅指定子は、指数幅を指定できるすべての編集記述子(つまりE
、EN
など、ただしD
は除く)で使用できます。 これは指数の最小幅の書式設定を指定します。 例えば、Print '(7X,3ES10.2E0)', 1.23, 4.56E24, 7.89D101
は以下を出力します1.23E+0 4.56E+24 7.89E+101
-
E
、D
、EN
およびES
編集記述子は出力で幅ゼロを持つことができます。 これはI
およびその他の編集記述子と同様に、最小幅編集を提供します。つまり、 処理系はフィールドがアスタリスクで埋められることなく幅 w の最小値を選択します。 これは、先頭の空白が抑止され、E
およびD
については、スケール ファクターがゼロ以下の場合、小数記号の前のオプションのゼロが抑止されることを意味します。例えば、以下に示す書式で 12.3 を印刷すると、先頭および末尾の空白なしで以下の結果が表示されます。
E0.4
.1230E+02
E0.4E3
.1230E+002
1PE0.4
1.2300E+00
EN0.4
12.3000E+00
ES0.4
1.2300E+01
E0.4E0
.1230E+2
フィールド幅は指数の形式に影響しません。つまり、数字を最小幅で印刷するには、指数幅ゼロも使用する必要があります(上記の最後の例で示されているように)。
これらの編集記述子の仮数部分の末尾のゼロを除去する手段はありません(新しい
EX
編集記述子では可能です)。 -
G0.d
編集記述子は、整数、論理、および文字型で許可されます。 Fortran 2008 ではこれは入出力エラーでした。 Fortran 2018 では、整数の場合はI0
、論理の場合はL1
、文字の場合はA
と同じ効果があります。 例えば、Print '(7X,"start:",3G0.17,":end")', 123, .True., 'ok'
はstart:123Tok:end
を印刷します。 -
新しい編集記述子
EXw.d
およびEXw.dEe
は、 16進仮数部を持つ浮動小数点数の出力に使用することができます。 書式は[ s ]
ここで、s はオプションのプラスまたはマイナス符号(+ または −)、 各 xi は16進数(0X
x0.
x1x2… exponent0
…9
またはA
…F
)、 そして exponent は10進数で表された2のべき乗(二進指数)で、書式はP
s z1…zn です。オプションのE
e が現れる場合、n は e と等しく、そうでない場合は指数を表すのに必要な最小の桁数です。 指数がゼロに等しい場合、符号 s はプラス符号です。数字 d の桁数がゼロの場合、生成される仮数桁 xi の数は内部値を正確に表す最小の数です。 内部値の基数が2のべき乗でない場合、d はゼロであってはなりません。
入力において、
EX
編集記述子の効果はF
編集記述子と同一です。最初の16進数桁の値はゼロでないことを除いて標準化されていません。 したがって、コンパイラ によっては、
EX0.1
で 1.0 の値を書くと0X1.0P+0
、0X2.0P-1
、0X4.0P-2
、または0X8.0P-3
を生成するかもしれません。 nAG Fortran コンパイラは常に最上位ビットをセットするように仮数をシフトするため、 この場合は0X8.0P-3
を出力します。 -
並び、変数群、および明示的書式設定(例:
F
編集記述子)を使用した浮動小数点数の入力は、16進数仮数部形式の入力値を受け入れます。 これは、EX
編集記述子によって生成される形式です。 16進数仮数部値は常にオプションの符号に続いて数字のゼロと文字X
で始まります。 つまり、+0X
、-0X
、または0X
であり、明確な曖昧さはありません。例えば、‘
-0XA.P-3
’ を読み取ると値-1.25
を生成します。数値入力の通常の規則として、小文字入力は大文字と同様に扱われます。したがって
-0xa.p-3
は-0XA.P-3
と同じ値を生成します。 -
要素的組み込み関数
OUT_OF_RANGE
は、変換が範囲外である場合にのみ真を返します。 その構文は以下の通りです:OUT_OF_RANGE ( X, MOLD [ , ROUND ] )
X
: 実数型または整数型MOLD
: 実数型または整数型のスカラーROUND
(オプション) : 論理型のスカラー結果 : 基本種別の論理型。
結果は、
X
の値がエラーなしでMOLD
の型および種別に変換できる値の範囲外である場合にのみ真です。MOLD
引数が変数である場合、値が定義されている必要はありません。その型と種別だけが使用されます。ROUND
引数は、X
が実数型でMOLD
が整数型の場合にのみ許可されます。実数から整数への変換では、デフォルトのチェックは値が組み込み関数
INT (X, KIND (MOLD))
に対して範囲外であるかどうかです。これは組み込み代入で使用される同じ変換です。ROUND
引数が.TRUE.
の値で存在する場合、チェックは代わりに値が組み込み関数NINT (X, KIND (MOLD))
に対して範囲外であるかどうかです。例えば、
OUT_OF_RANGE (127.5, 0_int8)
は偽ですが、OUT_OF_RANGE (127.5, 0_int8, .TRUE.)
は真です。X
の値が IEEE 無限大である場合、OUT_OF_RANGE
は、MOLD
の型および種別が IEEE 無限大をサポートしていない場合にのみ.TRUE.
を返します。 同様に、X
が IEEE NaN である場合、結果はMOLD
が IEEE NaN をサポートしていない場合にのみ真です。ある種別の実数型から別の種別の実数型への変換をチェックする場合(例えば、
REAL(real32)
からREAL(real16)
またはREAL(real64)
からREAL(real32)
へ)、 有限値がHUGE (KIND (MOLD))
より大きい場合は範囲外と見なされますが、 無限大の値は範囲外とは見なされません。 つまり、OUT_OF_RANGE (1.0E200_real64, 1.0_real32)
は.TRUE.
を返しますが、OUT_OF_RANGE (IEEE_VALUE (1.0_real64, IEEE_POSITIVE_INF), 1.0_real32)
は.FALSE.
を返します。この関数は要素的であり、定数式(
X
の値が定数であり、ROUND
引数が欠落しているか定数である場合)で使用できますが、X
引数のみが配列であることが許可されています。 したがって、結果は常にX
のランクと形状を持ちます。 -
組み込みサブルーチン
DATE_AND_TIME
のVALUES
引数は、少なくとも 4 の 10 進指数範囲を持つ任意の種別の整数であることができます。つまり、8ビット整数を除く任意の種別です。 例えば、Program show_year Use Iso_Fortran_Env Integer(int16) v(8) Call Date_And_Time(Values=v) Print *,'The year is',v(1) End Program
-
組み込みサブルーチン
EXECUTE_COMMAND_LINE
のWAIT
引数は、任意の種別の論理型であることができます。CMDSTAT
およびEXITSTAT
引数は、少なくとも 4 の 10 進指数範囲を持つ任意の種別の整数であることができます。つまり、8ビット整数を除く任意の種別です。 例えば、Program ok Use Iso_Fortran_Env Logical(logical8) :: w = .True._logical8 Integer(int16) :: cstat Integer(int64) :: estat Call Execute_Command_Line('echo ok',w,estat,cstat) If (estat/=0 .Or. cstat/=0) Print *,'Bad STAT',estat,cstat End Program
は、‘echo
’ が Unix の echo コマンドであると仮定すると、ok
を表示します。 -
組み込みサブルーチン
GET_COMMAND
、GET_COMMAND_ARGUMENT
、およびGET_ENVIRONMENT_VARIABLE
には、引数リストの最後にオプションのERRMSG
引数があります。 エラーが発生すると(つまり、STATUS
引数に正の値が割り当てられる場合)、ERRMSG
引数に説明メッセージが割り当てられます。 エラーが発生しない場合(STATUS
引数にゼロまたは負の値が割り当てられる場合)、ERRMSG
引数は変更されません。STATUS
引数が省略されても、ERRMSG
引数に対する効果は(または発生しません)発生します。 しかし、エラーが発生しない場合には変更されないため、エラーを検出するためのSTATUS
引数の代わりにはなりません。例えば、このプログラムを実行すると、
Program test Character(200) msg,value Integer status Call Get_Environment_Variable('Does Not Exist',value,status,Errmsg=msg) If (status>0) Print *,Trim(msg) End Program
は、‘Does Not Exist
’ という環境変数が存在しない限り、以下を出力しますEnvironment variable does not exist
-
組み込み関数
IMAGE_INDEX
には2つの追加形式があります:IMAGE_INDEX( COARRAY, SUB, TEAM ) IMAGE_INDEX( COARRAY, SUB, TEAM_NUMBER )
TEAM
:TEAM_TYPE
型のスカラー、Intent(In)
;
TEAM_NUMBER
: 整数型のスカラー、Intent(In)
。COARRAY
とSUB
引数の意味は変わりませんが、サブスクリプトは指定されたチーム用として解釈されます。 返り値も同様に指定されたチームの像番号です。 -
乱数生成器(組み込み
RANDOM_NUMBER
)は現在、像ごとになりました。 Fortran 2008 ではコンパイラがすべての像間で共有される単一の乱数ストリームを使用することを許可していましたが、 Fortran 2018 ではそれを許可せず、代わりに各像が独自の乱数状態を持つことを要求します。 -
新しい組み込みサブルーチン
RANDOM_INIT
は、呼び出し像上の乱数生成器を初期化します。 その構文は以下の通りです:CALL RANDOM_INIT ( REPEATABLE, IMAGE_DISTINCT )
REPEATABLE
: 論理型のスカラー、Intent(In)
;
IMAGE_DISTINCT
: 論理型のスカラー、Intent(In)
。IMAGE_DISTINCT
が真の場合、乱数生成器の初期状態(シード)は呼び出し像ごとに異なります。そうでない場合、初期状態は像に依存しません。REPEATABLE
が真の場合、プログラムの各実行は同じ初期シード(IMAGE_DISTINCT
も真である場合は像依存)を使用します。そうでない場合、プログラムの各実行は異なる初期シードを使用します。RANDOM_INIT
の呼び出しがない場合、nAG Fortran コンパイラのデフォルトはREPEATABLE=
偽 およびIMAGE_DISTINCT=
真です。 -
標準組み込みモジュール
IEEE_ARITHMETIC
には、IEEE (ISO/IEC 60559) 算術の追加サポートを提供する追加の定数、型、および手続きがあります。 既存の手続きの3つには、追加のオプション引数があります。-
名前付き定数
IEEE_AWAY
はIEEE_ROUND_TYPE
型で、ゼロから離れる方向への丸めモードを表します。 IEEE 標準はこの丸めモードを十進数でのみ要求し、二進数ハードウェアはこれをサポートしていないため、使用できません。 -
要素関数
IEEE_FMA
は、融合乗算加算演算を実行します。 その構文は以下の通りです:IEEE_FMA (A, B, C)
A
: 実数型;
B
:A
と同じ型および種;
C
:A
と同じ型および種。結果 :
A
と同じ型および種。この関数の結果は、(
A
×B
)+C
の値が1回の丸めでのみ行われることです。 つまり、全体の操作が数学的に計算され、最後にA
の形式に丸められます。 例えば、A
×B
がオーバーフローしてもIEEE_OVERFLOW
はシグナルされませんが、最終結果が範囲外である場合のみシグナルされます。制限:
A
の種別が IEEE 形式でない場合、この関数を呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (A)
が偽を返す場合です。 -
純粋なサブルーチン
IEEE_GET_MODES
は、停止モード、丸めモード、およびアンダーフローモードを単一のオブジェクトで取得します。 その構文は以下の通りです:IEEE_GET_MODES (MODES)
MODES
:IEEE_MODES_TYPE
型のスカラー、Intent(Out)
。IEEE_SET_MODES
によってモードを復元するために使用することができます。 -
現在の丸めモードを取得する純粋なサブルーチン
IEEE_GET_ROUNDING_MODE
には、基数を指定するオプションの引数が追加されました。 その構文は現在以下の通りです:IEEE_GET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
ROUND_VALUE
:IEEE_ROUND_TYPE
型、Intent(Out)
;
RADIX
(オプション) : 整数、Intent(In)
、2または10と等しくなければなりません。ROUND_VALUE
引数には指定された基数の現在の丸めモードが割り当てられます。RADIX
が現れない場合、二進丸めモードが割り当てられます。 -
要素別処理関数
IEEE_INT
は、IEEE 実数値を特定の丸めモードで整数に変換します。 その構文は以下の通りです:IEEE_INT (A, ROUND [, KIND ])
A
: 型 実数;
ROUND
: 型IEEE_ROUND_TYPE
;
KIND
(任意) : スカラ 整数 定数式;
結果 : 型 整数,KIND
が指定されている場合はKIND
の種別、それ以外の場合は基本種別。A
の値は、ROUND
によって指定された丸めモードを使用して整数に丸められます。 その値が結果の種別で表現可能な場合、結果はその値を持ちます; そうでない場合、結果は処理系依存で、IEEE_INVALID
が通知されます。この操作は、IEEE 標準によって指定された
convertToInteger{round}
またはconvertToIntegerExact{round}
操作のいずれかです。 後者の場合、IEEE_INVALID
が通知されず、A
が既に整数でなかった場合、IEEE_INEXACT
が通知されます。制限: この関数は、
A
の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (A)
が false を返す場合です。 -
要素別処理関数
IEEE_MAX_NUM
,IEEE_MAX_NUM_MAG
,IEEE_MIN_NUM
,IEEE_MIN_NUM_MAG
は、NaN 値を無視して最大/最小操作を実行します。 引数が signalling NaN の場合、IEEE_INVALID
が発生します。 引数の一方だけが NaN の場合、結果はもう一方の引数です; 両方の引数が NaN の場合のみ、結果は NaN です。IEEE_MAX_NUM
の構文は以下の通りです:IEEE_MAX_NUM (X, Y)
X
: 型 実数;
Y
:X
と同じ型及び種別;
結果 :X
と同じ型及び種別。X
とY
の最大値で、NaN を無視します。制限: この関数は、
X
の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (X)
が false を返す場合です。IEEE_MAX_NUM_MAG
は構文が同じです(名前を除く), そして結果はX
とY
のうち大きさが大きい方です。 同じ制限が適用されます。IEEE_MIN_NUM
は構文が同じです(名前を除く), そして結果はX
とY
の最小値で、NaN を無視します。 同じ制限が適用されます。IEEE_MIN_NUM_MAG
は構文が同じです(名前を除く), そして結果はX
とY
のうち小ささが小さい方です。 同じ制限が適用されます。 -
派生型
IEEE_MODES_TYPE
には、すべての浮動小数点モードが含まれています: 停止モード、丸めモード、およびアンダーフローモード。 これは、IEEE_GET_MODES
およびIEEE_SET_MODES
サブルーチンによって使用されます。 -
要素別処理関数
IEEE_QUIET_
{EQ
|NE
|LT
|LE
|GT
|GE
} は、オペランドが quiet NaN であっても、信号を発生させずに二つの IEEE 形式数を比較します。 オペランドが signalling NaN の場合、IEEE_INVALID
例外が発生します。IEEE_QUIET_EQ
とIEEE_QUIET_NE
は、IEEE 形式の数値にのみ使用可能な点を除いて、==
と/=
と全く同じです。IEEE_QUIET_EQ
関数の構文は以下の通りです:IEEE_QUIET_EQ (A, B)
A
: 型 実数 (任意の IEEE 種別);
B
:A
と同じ型及び種別;結果 : 基本種別の論理型。
IEEE_QUIET_NE
などの構文は、関数の名前を除いて同じです。制限: これらの関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、
IEEE_SUPPORT_DATATYPE (X)
が false を返す場合です。 -
要素別処理関数
IEEE_REAL
は、整数またはIEEE形式の実数値を指定されたIEEE形式の実数値に変換します。 その構文は以下の通りです:IEEE_REAL (A, [, KIND ])
A
: 型 実数 または 整数;
KIND
(任意) : スカラ 整数 定数式;
結果 : 型 実数,KIND
が指定されている場合はKIND
の種別、それ以外の場合はデフォルトの種別。A
の値が結果の種別で表現可能な場合、その値が結果です。 そうでない場合、A
の値は現在の丸めモードを使用して結果の種別に丸められます。制限: この関数は、
A
の種別または結果の種別がIEEE形式でない場合には呼び出してはなりません。 つまり、IEEE_SUPPORT_DATATYPE (A)
またはIEEE_SUPPORT_DATATYPE(REAL(0,KIND))
が false を返す場合です。 -
純粋サブルーチン
IEEE_SET_MODES
は、以前にIEEE_GET_MODES
が呼び出されたときの状態に停止モード、丸めモード、およびアンダーフローモードを設定します。 その構文は以下の通りです:IEEE_SET_MODES (MODES)
MODES
: 型IEEE_MODES_TYPE
のスカラ、Intent(In)
。MODES
の値は、IEEE_GET_MODES
を介して取得されたものでなければなりません。 -
純粋サブルーチン
IEEE_SET_ROUNDING_MODE
は、丸めモードを設定しますが、 基数を指定するオプションの引数が追加されました。 その構文は現在以下の通りです:IEEE_SET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
ROUND_VALUE
: 型IEEE_ROUND_TYPE
,Intent(In)
;
RADIX
(任意) : 整数,Intent(In)
, 2 または 10 でなければなりません。指定された基数の丸めモードは
ROUND_VALUE
に設定されます。RADIX
が指定されていない場合、二進の丸めモードが設定されます。制限: このサブルーチンは、いくつかの
X
(それが存在する場合は基数RADIX
で) に対してIEEE_SUPPORT_DATATYPE(X)
とIEEE_SUPPORT_ROUNDING(ROUND_VALUE,X)
の両方が true である場合にのみ呼び出されるべきです。 -
要素別処理関数
IEEE_SIGNALING_
{EQ
|NE
|LT
|LE
|GT
|GE
} は、二つのIEEE形式の数を比較し、 オペランドがNaN(静かなNaNでも信号を発するNaNでも)である場合にはIEEE_INVALID
例外を発生させます。IEEE_SIGNALING_LT
,IEEE_SIGNALING_LE
,IEEE_SIGNALING_GT
,IEEE_SIGNALING_GE
は、 IEEE形式の数値にのみ使用可能な点を除いて、<
,<=
,>
,>=
と完全に同じです。IEEE_SIGNALING_EQ
関数の構文は以下の通りです:IEEE_SIGNALING_EQ (A, B)
A
: 型 実数 (任意の IEEE 種別);
B
:A
と同じ型及び種別;結果 : 基本種別の論理型。
IEEE_SIGNALING_NE
などの構文は、関数の名前を除いて同じです。制限: これらの関数は、X の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、
IEEE_SUPPORT_DATATYPE (X)
が false を返す場合です。 -
要素別処理関数
IEEE_SIGNBIT
は、IEEE 形式の数値の符号ビットを問い合わせます。 その構文は以下の通りです:IEEE_SIGNBIT (X)
X
: 型 実数 (任意の IEEE 種別);結果 : 基本種別の論理型。
結果は符号ビットがセットされている(NaNでない任意の値に対して負を示す)場合、かつその場合に限り、真です。
制限: この関数は、
X
の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (X)
が false を返す場合です。 -
要素別処理関数
IEEE_RINT
は、現在必要とされる丸めを指定するオプションの引数を持つようになりました。 その構文は現在以下の通りです:IEEE_RINT (X [, ROUND ])
X
: 型 実数;
ROUND
(任意) : 型IEEE_ROUND_TYPE
。結果 :
X
と同じ型及び種別。ROUND
が存在する場合、結果はROUND
によって指定されたモードに従って整数に丸められたX
の値です。これはIEEE標準でroundToIntegral{rounding}
と呼ばれる操作です。ROUND
が存在しない場合、結果は現在の丸めモードに従って整数に丸められたX
の値です。これはIEEE標準でroundToIntegralExact
と呼ばれる操作です。制限: この関数は、
X
の種別が IEEE 形式でない場合には呼び出してはなりません。つまり、IEEE_SUPPORT_DATATYPE (X)
が false を返す場合です。
-
名前付き定数
-
組込みモジュール
ISO_C_BINDING
に名前付き定数C_PTRDIFF_T
が追加されました。 これは C の型ptrdiff_t
、つまり二つのポインタ間の差を保持するのに十分な大きさの整数に対応する整数の種別です。 例えば、引用仕様Interface Function diff_cptr(a,b) Bind(C) Use Iso_C_Binding Type(C_ptr),Value :: a, b Integer(C_ptrdiff_t) diff_cptr End Function End Interface
は C の関数ptrdiff_t diff_cptr(void *a,void *b) { return a - b; }
と相互運用します。 -
組込みモジュール
ISO_C_BINDING
では、手続きC_LOC
とC_FUNLOC
は 純粋手続きとみなされ、C_F_POINTER
とC_F_PROCPOINTER
は 非純粋手続きとみなされます。 純粋手続き内で使用される場合、C_FUNLOC
の引数もまた 純粋手続きでなければなりません。組込みモジュール
ISO_C_BINDING
では、手続きC_LOC
とC_FUNLOC
は 純粋手続と考えられ、C_F_POINTER
とC_F_PROCPOINTER
は 非純粋手続と考えられます。 純粋手続内で使用される場合、C_FUNLOC
の引数もまた 純粋手続でなければなりません。 -
別のモジュールからアクセスされる実体のモジュール内のデフォルトのアクセシビリティ(
USE
文を通じて) は、PUBLIC
またはPRIVATE
文でそのモジュール名を指定することにより制御でき、 インポートするモジュール内の他の実体のデフォルトのアクセシビリティを上書きできます。 例えば、Module mymod Use Iso_Fortran_Env Real(real32) x Integer(int64) y Private Iso_Fortran_Env End Module
ISO_FORTRAN_ENV
のすべての実体は、個別にリストする必要なく、モジュールmymod
ではデフォルトでPRIVATE
です。この新しいデフォルトのアクセシビリティは、明示的な
PUBLIC
またはPRIVATE
宣言によって上書きすることができます。 また、遠隔モジュール(2つ以上のUSE
文がある)の実体に複数の介在モジュールを介してアクセスされる場合、その実体へのすべての経路がデフォルトでPRIVATE
の場合にのみデフォルトでPRIVATE
となり、任意の経路がデフォルトでPUBLIC
である場合はデフォルトでPUBLIC
となります。 例えば、Module remote Real a,b End Module Module route_one Use remote Private remote End Module Module route_two Use remote End Module Module my_module Use route_one Use route_two Private route_one End Module
モジュール
REMOTE
の変数A
とB
は、モジュールMY_MODULE
でPUBLIC
です、 なぜならそれらはデフォルトでPUBLIC
のモジュールROUTE_TWO
経由でアクセス可能だからです。 -
IMPLICIT NONE
文は現在、TYPE
およびEXTERNAL
仕様を持つことができます。 その完全な構文は次のとおりです:IMPLICIT NONE
[(
[ implicit-none-specifier-list ])
]EXTERNAL
とTYPE
のコンマ区切りリストです。 リスト内にキーワードが複数回出現することはありません。 リストが表示されない場合、またはリストにTYPE
が表示される場合、そのスコーピングユニットに他のIMPLICIT
文が表示されることはありません。IMPLICIT NONE ()
IMPLICIT NONE (TYPE)
IMPLICIT NONE
キーワード
EXTERNAL
が出現し、キーワードTYPE
が出現しない場合、暗黙の型付けは 無効化されません、 そして他のIMPLICIT
文がそのスコーピングユニットに出現することができます。 キーワードTYPE
とEXTERNAL
の両方が出現する場合、 暗黙の型付けは無効化され、暗黙の引用仕様を持つ手続きにはEXTERNAL
属性が必要です。 たとえば、Subroutine sub(x) Implicit None (External) Integer f Print *,f(x) End Subroutine
は、関数F
にEXTERNAL
属性がないため、エラーを生成します。キーワード
EXTERNAL
が出現し、キーワードTYPE
が出現しない場合、暗黙の型付けは 無効化されません、 そしてそのスコーピングユニットに他のIMPLICIT
文が出現することができます。 キーワードTYPE
とEXTERNAL
の両方が出現する場合、 暗黙の型付けは無効化され、暗黙の引用仕様を持つ手続きにはEXTERNAL
属性が必要です。 -
IMPORT
文は、BLOCK
構造体とネストされたサブプログラム内に出現することができます。 デフォルトでは、そのようなスコーピングユニットは親スコープ内のすべての実体に対して親子結合によってアクセスできるため、 これ自体は(コンパイラがチェックした)ドキュメントとしてのみ有用です。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import :: x, y …
-
親子結合に対する制御は、
IMPORT,NONE
、IMPORT,ALL
、およびIMPORT,ONLY
文によって提供されます。 他のIMPORT
文と同様に、それらは引用仕様本体、BLOCK
構造体、および 含まれるサブプログラム内にのみ出現し、USE
文と他の仕様文の間に出現します。IMPORT,NONE
文は、親スコープ内の実体が親子結合によってアクセス不可能であることを指定します。 これは分離したモジュール手続き引用仕様以外の引用仕様本体のデフォルトです。 スコーピングユニット内にIMPORT,NONE
文が出現する場合、他のIMPORT
文は出現できません。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import,None Implicit Integer (a-z) Read *,x Print *,x End Subroutine End Subroutine
サブルーチンINNER
の中のX
は、その親OUTER
のX
への参照ではなく、INNER
にローカルな暗黙の型付けされた(Integer
)変数です。IMPORT,ALL
文は、すべての親実体にアクセスされることを指定します。 つまり、そうでなければ親実体をアクセス不可能にする宣言(いわゆる「シャドウイング」)は無効です。 例えば、Subroutine outer(x,y) Real,Intent(InOut) :: x, y(:) … Contains Subroutine inner Import,All Integer,External :: y …
INNER
内のY
の宣言は無効であり、コンパイルエラーを生成します。 スコーピングユニット内にIMPORT,ALL
文が出現する場合、他のIMPORT
文は出現できません。IMPORT,ONLY
文は、IMPORT,ONLY
文で名前が指定された親実体のみが 親子結合によってアクセス可能であることを指定します。 スコーピングユニット内にIMPORT,ONLY
文が出現する場合、他のすべてのIMPORT
文はONLY
キーワードを持たなければなりません。 例えば、Subroutine outer(x,y,z) Real,Intent(InOut) :: x, y(:),z … Contains Subroutine inner Import,Only:x,y z = x + y
INNER
のX
とY
への参照は親(OUTER
)の実体への参照ですが、INNER
のZ
への参照は暗黙の型付けされたローカル変数への参照です。 -
配列構成子または
DATA
文の中の暗示的なDO
ループは、ループ制御の前に整数型の型指定を持つことができるようになりました。 配列構成子内のそのようなループの構文は(
ac-value-list,
integer-type-spec::
ac-do-variable=
from,
to [,
step ])
DATA
文内のそのようなループの構文は(
data-i-do-object-list,
integer-type-spec::
data-i-do-variable=
from,
to [,
step ])
INTEGER
で始まる任意の型指定です。その効果は、ループ内部で、暗示的-
DO
変数(ac-do-variable または data-i-do-variable)が、ループの外部で持つかもしれない型や種別にかかわらず、integer-type-spec によって指定された型と種別を持つことです。ループを含むスコープ内に同じ名前の実体がある場合、それはスカラ変数でなければならないことに注意してください。 たとえば、手続き名や型名であってはなりません。
例えば、
Real x Print *, [ (x, Integer :: x = 1, 10) ]
は有効であり、整数値 1 から 10 までの出力を生成します。 同様に、Real x, y(10) Data (y(x),Integer::x=1,10,2) / 5*0 /
は有効で、Y
の奇数番目の要素をゼロで初期化します。これは、サブスクリプトが基本整数種別の範囲を超える可能性がある場合に特に有用です。 例えば、
Real,Pointer :: a(:) ... Print *, [ (f(a(i)), Integer(int64) :: i = Lbound(a,1,int64), Ubound(a,1,int64)) ]
は、例えば境界が 20000000000:20000000005 であっても、A
の各要素に関数F
を適用します。 -
DO CONCURRENT
構造体には、局所性指定子LOCAL
、LOCAL_INIT
、およびSHARED
を持つことができます。 これらの局所性指定子は、ループ内外で変数がどのように使用されるかを決定し、ループインデックス変数には適用されません。これらは常に実質的にLOCAL
です。DEFAULT(NONE)
局所性指定子もあり、DO CONCURRENT
内で使用されるすべての変数に明示的な局所性を指定する必要があります。DO CONCURRENT
文の改訂された構文は、文番号と構造体名を無視して、次のようになります:DO CONCURRENT
concurrent-header [ locality-spec ]...LOCAL (
variable-name-list)
LOCAL_INIT (
variable-name-list)
SHARED (
variable-name-list)
DEFAULT (NONE)
LOCAL
またはLOCAL_INIT
指定子に出現する変数は、比較的普通の変数でなければなりません:ALLOCATABLE
やOPTIONAL
属性を持ってはならず、割付け可能な最終コンポーネントを持ってはならず、共配列や想定サイズ配列であってはなりません。 多相的である場合、POINTER
属性を持っていなければなりません。 最後に、変数定義コンテキストに出現することが許可されていなければなりません:例えば、INTENT(IN)
であってはなりません。LOCAL
とLOCAL_INIT
の効果は、構造体内の変数が構造体外のものと完全に別であることです。LOCAL
の場合、各反復は未定義で始まり、LOCAL_INIT
の場合、外部変数の値で各反復が始まります。 これにより、LOCAL
とLOCAL_INIT
変数が反復間の依存関係を引き起こすことがないようにします。SHARED
である変数は、構造体内外で同じ変数です。 ある反復によって値が与えられた場合、他の反復によって参照されたり値が与えられたりしてはなりません。 割付け可能であるかポインタである場合、同様に単一の反復によってのみ割り当てられたり、解放されたり、ポインタ割り当てされたりしてはなりません。 不連続配列がSHARED
である場合、連続仮引数に実引数として渡されてはなりません(つまり、 仮引数は想定形状であるかポインタでなければならず、CONTIGUOUS
属性を持ってはなりません)。DO CONCURRENT
構造体内の変数に局所性指定子を提供することは、コードの可読性を向上させるだけでなく、 適切なコンパイラオプションを使用して、コンパイラがループを並列化しやすくします。 (リリース7.2時点で、nAG Fortran コンパイラにはそのようなオプションはありません。) -
算術
IF
文は削除された機能として扱われます。 (これは、式がIEEE非数の場合の挙動が未定義であり、良い定義を持つことができないためです。) 例えば、ファイルdel.f90
に以下が含まれている場合Subroutine sub(x) Real,Intent(In) :: x If (x) 1,2,3 1 Stop 1 2 Stop 2 3 Stop 3 End Subroutine
この警告メッセージが生成されます:Deleted feature used: del.f90, line 3: Arithmetic IF statement
-Error=Deletedオプションが使用された場合、これはエラーとして扱われます。 -
文番号付きの
DO
構文は廃止予定と見なされます (これは、END DO
文と構築文番号によって効果的に置き換えられます)。 さらに、非ブロックDO
構文は削除された機能として扱われます。 非ブロックのDO
は、共有DO
終了文番号を持つ2つ以上のネストしたDO
ループ、 またはEND DO
またはCONTINUE
以外の終了文を持つDO
ループのいずれかです。 (これは、これらが理解しにくく、エラーが発生しやすく、Fortran 90以降はブロックDO
構文を介してより良い機能が利用可能であるためです。) 例えば、ファイルobsdel.f90
に以下が含まれている場合Subroutine sub(w,x,y) Real,Intent(InOut) :: w(:),x(:,:), y(:) Integer i,j Do 100 i=1,Size(w) w(i) = w(i)**2 + 4*w(i) - 4 100 Continue Do 200 j=1,Size(x,2) Do 200 i=1,Size(x,1) If (x(i,j)<0) Go To 200 x(i,j) = Sqrt(x(i,j)+1) 200 Continue Do 300 i=1,Size(y) If (y(i)<0) Go To 300 y(i) = Log(y(i)) 300 Print *,y(i) End Subroutine
これらの警告メッセージが生成されます:Obsolescent: obsdel.f90, line 4: DO statement with label (100) Obsolescent: obsdel.f90, line 7: DO statement with label (200) Obsolescent: obsdel.f90, line 8: DO statement with label (200) Deleted feature used: obsdel.f90, line 11: 200 is a shared DO termination label Obsolescent: obsdel.f90, line 12: DO statement with label (300) Deleted feature used: obsdel.f90, line 15: DO 300 ends neither with CONTINUE nor ENDDO
-
FORALL
文と構造は廃止予定と見なされます。 これは、通常、通常のDO
またはDO CONCURRENT
よりもパフォーマンスが悪いためです。 例えば、ファイルobs.f90
に以下が含まれている場合Subroutine sub(a,b,c) Real,Intent(InOut) :: a(:) Real,Intent(In) :: b(:),c Integer i Forall(i=1:Size(a)) a(i) = b(i)**2 - c End Forall End Subroutine
この警告メッセージが生成されます:Obsolescent: obs.f90, line 5: FORALL construct
-
Fortran言語レベルが2018以上(デフォルト)の場合、
F90_KIND
やOMP_LIB
などの非標準の組込みモジュールの使用に対して拡張メッセージが生成されます。
5 Fortran 2023 サポート
nAG Fortran コンパイラは、最近改訂され公開された Fortran 2023 標準の以下にリストされている機能をサポートしています。
- フリー形式のソースコードの行は最大 10000 文字までとなります。 -f2023 オプションが使用されていない場合、132 文字を超える任意の行に対して拡張メッセージが生成されます。 (nAG Fortran コンパイラは任意の長さの行を受け入れますが、10000 文字を超える行は Fortran 2023 の拡張として報告されます。)
-
組み込み問合せ関数
SELECTED_LOGICAL_KIND
は、指定されたサイズの論理型の種別番号を返します。 この関数の構文は以下の通りです:SELECTED_LOGICAL_KIND ( BITS )
BITS
: スカラー整数;結果 : 基本種別のスカラー整数。
結果は、
BITS
ビット以上のサイズを指定する論理型の種別タイプパラメタ値です。BITS
が論理型の最大の種別のストレージサイズを超える場合、結果は −1 になります。 従って、BITS
が 8 以下であれば、すべての既知のコンパイラがサポートしている単一バイトの論理型の種別を返します。 nAG Fortran コンパイラでは、BITS
が 64 を超える場合、結果は −1 になります。これは、サポートされている最大の論理型が 64 ビットであるためです。 -
標準組み込みモジュール
ISO_FORTRAN_ENV
には、指定されたビットサイズの論理型の種別型パラメタ値を提供する追加の名前付き定数が含まれています:LOGICAL8
、LOGICAL16
、LOGICAL32
、およびLOGICAL64
。 指定されたサイズの論理型が存在しない場合、その定数は −1 の値を持ちます。 -
AT
編集記述子は文字データの出力に使用できます。 文字データは、出力項目の各要素が組み込み関数TRIM
の呼び出しで囲まれているかのように、後続の空白が省略されて出力されます。例えば、以下のコードは
Character(100) :: a(3) a(1) = 'o' a(2) = 'ka' a(3) = 'y' Print '(8X,3AT)', a
以下を出力します。okay
ここで、後続の空白はありません。AT
編集記述子は入力(READ
文)には使用できません。
6 追加の OpenMP サポート
現時点で OpenMP 4.0 および 4.5 は部分的にのみサポートされています。
これには SIMD
および TARGET
構造体が含まれ、DO SIMD
および TARGET DATA
、
および LINEAR
節などの節が含まれます。
OpenMP 4.0 および 4.5 のサポートを完了するための更新が近日中に行われます。
7 追加のエラーチェック
-
FORMAT
文または定数文字列として使用される書式の編集記述子のフィールド幅が、 一部の値の出力に対して小さすぎる可能性がある場合、警告メッセージが発行されます。 例えば、プログラムProgram na Read *,x Print 100,x 100 Format('X has the value ',E9.3) End Program
は警告メッセージを生成しますWarning: na.f90, line 4: In E9.3 the width 9 may be too small for output of some numbers
フィールド幅が有限数の出力に対して小さすぎる場合(IEEE NaN は 3 の幅が必要です)、メッセージはそれを指摘します。例えば、例のE9.3
をE9.7
に変更すると、警告が生成されますWarning: na.f90, line 4: Field width too small for output of finite numbers - the E9.7 edit descriptor will produce all asterisks
フィールド幅が 3 より小さい場合、メッセージは再び変更されます。例えば、E2.1
の場合、警告は以下のようになります。Warning: na.f90, line 4: Field width of 2 for the E edit descriptor will inevitably produce all asterisks as output
-
デフォルト装置、例えば
UNIT=*
でREC=
やPOS=
指定子が現れるのをコンパイル時にエラーとして検出します。 デフォルト装置はシーケンシャルな書式付きユニットであり、それらの指定子はシーケンシャル入出力と共に使用できません。 例えば、以下のコードをコンパイルするとProgram badio Write(*,'(A)',Rec=999) 'Oops' End Program
以下のようなエラーが発生しますError: badio.f90, line 2: REC= and UNIT=* are not compatible
-
ファイル内の他の場所で要素的であると表示されている手続きを、暗黙のインターフェイスで呼び出すことがコンパイル時にエラーとして検出されます。
例えば、以下をコンパイルすると
Program c Real a(10) Call d(a,1.0) Print *,a End Program Elemental Subroutine d(x,y) Real,Intent(Out) :: x Real,Intent(In) :: y x = y End Subroutine
以下のようなエラーが発生しますError: c.f90: Explicit interface required for ELEMENTAL procedure D referenced from C
-
CHANGE TEAM
構造体内で活動状態のチーム変数を変更する最も明白なケースがコンパイル時にエラーとして検出されます。 Fortran 標準は、コンパイラが構造体全体を通じて活動状態のチーム変数を使用できるようにするために、そのような変更を禁止しています。 例えば、以下をコンパイルするとSubroutine teamswap(team1,team2) Use Iso_Fortran_Env Type(team_type),Intent(InOut) :: team1,team2 Type(team_type) tmp Change Team (team2) tmp = team1 ! Okay. team1 = team2 ! Okay. team2 = tmp ! BAD End Team End Subroutine
以下のような、エラーメッセージが生成されますError: teamswap.f90, line 8: Variable TEAM2 on left-hand side of assignment statement is the active team value for the CHANGE TEAM statement at line 5 of teamswap.f90
8 その他の拡張
-
倍精度および 4 倍精度
RANDOM_NUMBER
の低位ビットに完全なエントロピーがあります。 以前のリリースでは、数列に完全なエントロピーがありましたが、低位ビット(倍精度では 21 ビット、4 倍精度では 53 ビット)はランダムではありませんでした。 (これは、各個別の倍精度値に 32 ビット以上のランダム性が必要なシミュレーションにのみ影響します。)新しい方法は以前よりもかなり長い時間を要しますが、パフォーマンスは他のコンパイラと競合しています。 古い、より高速な方法は -random=5.3 オプションで選択でき、新しい方法は -random=7.2 オプションで確認できます。 これらのオプションはコンパイルされるファイル内の
RANDOM_NUMBER
の使用にのみ影響し、異なるオプションでコンパイルされた別々のファイルは結果のプログラムで組み合わされることができます。 -
-gline オプションは、-coarray=cosmp オプションまたは -openmp オプションと共に使用することができます。
CoSMP モードでは、エラー終了を引き起こした像の番号(初期チーム内)が報告されます。例えば、
ERROR STOP: failatend pco391.f90, line 20: Error occurred in PCO391:SUB pco391.f90, line 18: Called by PCO391:SUB pco391.f90, line 11: Called by PCO391:TEST pco391.f90, line 7: Called by PCO391 Error termination initiated by image 2
OpenMP モードでは、PARALLEL
構造体によって作成されたスレッド番号が報告されます。例えば、ERROR STOP: failatend suy008.f90, line 19: Error occurred in SUY008:SUB suy008.f90, line 17: Called by SUY008:SUB suy008.f90, line 10: Thread 8 created by OpenMP PARALLEL construct suy008.f90, line 8: Called by SUY008:TEST suy008.f90, line 2: Called by SUY008
- 標準行長を超えて延長されたコメントは、標準行長を超えて延長されたステートメントテキストとは別に報告されます。
-
-xldarg オプションは、コマンドライン上の次の引数をリンカフェーズにその位置で渡し、
-Wl, オプションとは異なり、翻訳せずに渡します(-Wl, オプションはカンマ区切りのオプションリストとなります)。
例えば、
nagfor a.o -xldarg -pathlist=abc,xyz b.lib
はリンクフェーズで以下のように展開されます。gcc a.o -pathlist=abc,xyz b.lib nAG-rts-specifications
しかし以下のように指定した場合はnagfor a.o -Wl,-pathlist=abc,xyz b.lib
リンクフェーズで以下のように展開されます。gcc a.o b.lib nAG-rts-specifications -pathlist=abc xyz
-
-fpplonglines オプションは、
fpp
プリプロセッサに対して、自由形式で 132 文字を超える出力行を折り返さないように指示します。 これは、fpp
の出力を別のツール(例えばfpp
プリプロセッサ自体)に渡す場合に便利です。そのツールはトークンが行を超えて続く中で#line
ディレクティブを期待していません。 -
-w=longlines オプションは、自由形式の行が Fortran 標準によって許可されている長さを超えている場合の警告を抑止します。これは Fortran 2018 までの 132 文字、および Fortran 2023 の 10000 文字です。
nAG Fortran コンパイラは任意の長さの自由形式の行を受け入れます。
- -u=all オプションは、すべての -u= サブオプションがアクティブであることを指定します。 このリリースでは、これは -u=external、-u=locality、 -u=sharing、および -u=type を含みます。
-
-u=external オプションは、
IMPLICIT NONE (EXTERNAL)
が有効であることを指定します。 これにより、外部および仮手続きは、明示的な引用仕様を持つか、明示的にEXTERNAL
属性を与えられる必要があります。例えば、ファイル
bad.f90
がProgram bad Call oops End Program
を含んでいる場合、-u=external オプションでコンパイルするとエラーが発生します。Error: bad.f90, line 3: External procedure OOPS does not have the EXTERNAL attribute
-
-u=locality は、すべての
DO CONCURRENT
構造がDEFAULT (NONE)
を指定したかのように扱われることを指定します。その局所性指定子は、DO CONCURRENT
構造内で参照されるすべての変数に明示的な局所性を与えることを要求します。例えば、ファイル
b.f90
がProgram b Real x(100) Do Concurrent(i=1:100) x(i) = i**2.0 End Do Print *,x End Program
を含んでいる場合、-u=locality オプションでコンパイルするとエラーが発生しますError: b.f90, line 4: Locality not specified for X in DO CONCURRENT with DEFAULT(NONE)
-
-Warn=double_real_literal オプションは、プログラム内の基本倍精度実数定数表現の存在を報告します。
これらは、D指数文字を持つ実数定数表現です(したがって、種別型パラメタはありません)。
報告は注釈として行われますが、10進数を基本倍精度に変換する際の不正確さが検出された場合は、警告として行われます。
例えば、以下のプログラムでは
Program dlits Print *,123d0 Print *,0.123d0 End Program
報告される警告は以下の通りです:Note: dlits.f90, line 2: Default double precision literal constant 123D0 Warning: dlits.f90, line 3: Inexact default double precision literal constant 0.123D0
このオプションは、特定の種別型パラメタを持つことを意図したプログラムで基本倍精度実数定数表現の存在を検出するのに役立つかもしれません。
-
-Warn=unkind_real_literal オプションは、プログラム内で種別指定子がない基本実数定数表現を報告します。
報告は注釈として行われますが、10進数をデフォルトの実数に変換する際の不正確さが検出された場合は、警告として行われます。
例えば、以下のプログラムでは
Program lits Print *,123.0 Print *,0.123 End Program
報告される警告は以下の通りです:Note: lits.f90, line 2: Real literal constant 123.0 has no kind specifier Warning: lits.f90, line 3: Inexact real literal constant 0.123 has no kind specifier
このオプションは、倍精度であること、または特定の種別型パラメタを持つことを意図したプログラムでデフォルト(単精度)の実数定数表現の存在を検出するのに役立つかもしれません。
-
-Error=class オプションは、class の警告メッセージをエラーとして扱うように指定します。
class の値は以下のいずれかでなければなりません(大文字小文字は区別されません):
Ancient FORTRAN 77の廃止予定で非標準の拡張機能の使用 Deleted Fortran標準から削除された機能の使用 Extension Fortran標準への廃止予定の使用 Obsolescent Fortran標準が廃止予定であると述べている機能の使用 Questionable プログラミングエラーを示している可能性のある有効だが疑問のある使用法 Warning 上記以外の警告クラスのメッセージ Any_Warning 上記のいずれか。 -Error=Obsolescent は -Error=Deleted を含むことに注意してください、 なぜならすべての削除された機能は以前は廃止予定でした。 また、-Error=Extension は -Error=Ancient を含むことに注意してください、 なぜなら古い廃止予定の拡張は拡張です。 また、-Error=Extensionは-Error=Ancientを含みます。 過去の廃止予定の拡張機能は、現在も拡張機能だからです。
また、メッセージの接頭辞が変更されないことに注意してください、例えば警告メッセージは依然として ‘
Warning:
’ で始まりますが、-colour オプションが使用される場合、メッセージの色はエラーとして色付けされます。 -
-strict95 オプションは、‘
CHARACTER*
’ 構文の使用に対する廃止予定の(警告)メッセージを生成していましたが、現在はデフォルトで有効になっており、無視されます。 代わりに、-nonstrict という新しいオプションがあり、それはこれらのメッセージを抑止し、多相的割付可能成分の成分の宣言された型の拡張である値の宣言された型に関する拡張メッセージも抑止します(これは常に許可されることが意図されていましたが、Fortran 2003の語句の誤りがFortran 2018まで修正されませんでした)。 -
LinuxとWindowsで利用可能な追加の-target=machine オプションがあります。machine は nehalem, westmere, sandybridge, ivybridge, haswell, broadwell, skylake, cannonlake, icelake, zen, または native(現在のマシンをターゲットにします)である可能性があります。
-
ポリッシュ(ソース整形)オプション -elcase=X は、指数文字(
E
またはD
)に使用するケースを設定します: X は Asis, lowercase, UPPERCASE、またはそれらの略語のいずれかでなければなりません; デフォルトは -elcase=UPPERCASE です。 X の解釈は大文字小文字を区別しません(例えば、-elcase=u は -elcase=U と同じです)。 -elcase=Asis は基本的なポリッシュ(=polish)でのみ利用可能であり、Enhanced Polish(=epolish)やその他のツール(例:=unifyprecision)では利用できないことに注意してください。 -
ポリッシュ(ソース整形)オプション -canonicalise_floating_literals は、浮動小数点定数表現の正規化を指定します。
浮動小数点リテラルの正規形は常に小数点を持ち、それより前とそれより後に少なくとも1桁があります。
指数文字が
E
の場合、指数は常に非ゼロです。 指数がある場合、指数文字の後には常に符号が続き、指数値に先行するゼロはありません。 例えば、Print *, .1, 1e0, 3d0, 2d-04
は(-elcase=U を使用して)次のように再フォーマットされます:Print *, 0.1, 1.0, 3.0D+0, 2.0D-4
-
-openmp オプションが使用されると、PolishはOpenMP
DO
構造を自動的に終了させ、その本体をインデントします。 例えば、以下をポリッシュ(整形)すると!$OMP do do i=1,10 a(i) = i end do
以前は以下のように整形されましたが!$Omp Do Do i=1,10 a(i) = i End Do
現在以下のようになります。!$Omp Do Do i=1,10 a(i) = i End Do !$Omp End Do
-
拡張ポリッシュ(拡張整形)は、引数なしの
SUBROUTINE
文とCALL
文に括弧を追加できます。 デフォルトでは、括弧は省略されます(BIND(C)
句を持つSUBROUTINE
文を除く)。 -subroutine_parens オプションは、括弧を生成します。例えば、拡張ポリッシュを -subroutine_parens(他のオプションなしで)とすると
CALL mysub
整形後はCall mysub()
となります。 -
Makefileの依存関係を生成する際、-odir
dir
オプションは、オブジェクトファイルが異なるディレクトリ(現在の作業ディレクトリではない)に配置されることを指定します。 例えば、“file.f90
” に依存するオブジェクトファイルは、単に “file.o
” ではなく “dir/file.o
” とみなされます。