Fortran Builder 7.1 リリースノート

1 概要

本ドキュメントでは、Fortran Builder 7.1 の新機能および変更点について説明します。

2 リリースの概要

Fortran Builderのリリース 7.1 では、以下を含むFortran 2008のすべて機能をサポートするようになりました。

  • データポインタを返す関数への参照が、代入文の左側を含む多くの場面で変数として使用できます。
  • その他、マイナーな機能追加が行われ、ポインタ指示先の初期化(これにより割付け可能な要素が再帰的もしくは相互に再帰的な型を持つことができる)や 手続ポインタを返す関数がが行えるようになりました。

また本リリースで、以下を含む数多くのFortran 2018の機能が追加されました。

  • 組込みの集約サブルーチン(CO_SUM他)の追加により、 Fortran 2018の共配列並列プログラミング機能をすべてサポートしました。
  • C言語の高度な相互運用性を部分的にサポートしました。 具体的には、次元数引継ぎ引数、型引継ぎ引数、およびC記述子がサポートされます。
  • RANK組込関数とSELECT_RANK構文を用いて、 (Cではなく)Fortranで直接次元引継ぎ引数が利用できます。
  • いくつかのマイナーな機能追加が行われ、 省略可能な仮引数が組込配列関数(SUMなど)のDIM引数として使用できるようになりました。

更に、本リリースでは新たにOpenMPプログラムを用いたプログラムでも、未定義変数のチェックができるようになり、OpenMPプログラミングへの対応が更に改善されました。

エラー診断も更に強化されました。

ソース整形機能も強化され、より柔軟な指定が可能となりました。

3 追加のOpenMPサポート

  • -C=undefined オプションによるOpenMPプログラムの未定義変数検出がサポートされました。
    例)
      Program bad
        Use omp_lib
        Real x,y(10)
        x = 3
        !$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(y)
          Do i=1,Size(y)
            y(omp_get_thread_num() + 1) = x * omp_get_thread_num()
          End Do
        !$OMP END PARALLEL DO
        Print *,y
      End Program
    
    以下が出力されます。
    実行時エラー: bad.f90, line 7: 定義されていない変数Xへの参照が行われました
    致命的なエラーでプログラムが終了しました
    

    4 追加のエラー診断

    • ALLOCATE文またはDEALLOCATE文で、同じ変数が複数回出現した場合、 エラーとして検出されるようになりました。
    • 型結合手続のオーバーライドとグローバルな整合性の診断で、仮引数の形状の違いを報告するようになりました。
    • SYSTEM_CLOCKへの8ビットまたは16ビットの整数引数は、値の受け取りには小さすぎるため、 エラーとして検出されるようになりました。
    • SYSTEM_CLOCKの引数の不一致で警告を出すようになりました。
      • 引数が無い場合
      • 整数引数が異なる種別である場合(Fortran 202xでは無効となるので)
      • 整数引数と実数引数が混同された場合
      • 整数引数がFortran 202xで推奨される64ビット整数でない場合
    • 変数が利用者定義入出力によって処理されない場合、割付け、ポインタ、またはアクセスできない成分の要素を持つ変数でNAMELISTを使用するとエラーが発生します。
    • 定数文字列の書式指定で、閉じる括弧の後に非空白文字がある場合、警告が発生します。
      例)
        Print '(1X,I0) whatever',13
      
      上記は以下のような警告を発します。
      疑問: ss.f90, line 1: 文字列の書式識別子で右括弧の後には余分な非空白文字「whatever」が現れます
      
    • CONTINUE文は何の効果も持ちませんが、文番号があれば分岐先の文になったり、 DOループの終わりになったりします。 しかし、文番号のないCONTINUE文は、何ら役に立ちません。 このような場合、Noteレベルの警告が発せられます。 CONTINUE文がDOループの中にある場合、 CプログラマはこれがCYCLE文の効果を持つと考えるかもしれないので、 Questionableに昇格されます。(Cではそうなっている)
      例)
        Program continues
          Continue
          Do i=1,10
            Print *,i**2
            Continue
          End Do
        End Program
      
      上記は以下の警告を発します。
      注意: ss.f90, line 2: CONTINUE文が文番号を持っていません
      疑問: ss.f90, line 5: DOループの中に文番号のないCONTINUE文がありますが、CYCLE文と勘違いしましたか?
      
    • パラメタ化された構造型の共配列を割り付ける場合、異なる像で長さ型パラメタの値が異なる場合、 実行時エラーとして検出されるようになりました。
      例)
      program bad
        type t(n,m,o)
          integer,len :: n,m,o
          real c(n,m,o)
        end type
        type(t(:,:,:)),allocatable :: x[:]
        if (num_images()<2) error stop '?Not enough images(2)'
        m1 = merge(123,456,this_image()==2)
        allocate(t(10,m1,30) :: x[*])
        print *,'FAIL',this_image(),size(x%c)
      end program
      
      実行時エラー: bad.f90, line 9: 共配列のALLOCATEで像1の型パラメタMの値が456ですが像2のは123です
      
    • 空のSELECT CASEおよびSELECT TYPE構文は、選択子の評価以外には何も行われないため、 Questionable として報告されます。

      例えばsub.f90が以下を含む場合、

        Subroutine sub(x,n)
          Class(*) x
          Integer n
          Select Case (n)
          End Select
          Select Type (x)
          End Select
        End Subroutine
      
      以下のような警告が発せられます。
      疑問: sub.f90, line 4: SELECT CASE構文が空です
      疑問: sub.f90, line 6: SELECT TYPE構文が空です
      

      また、最適化(-Oオプション)が使用されている場合、選択子の評価が行われない場合があります。

    • -C=intovfオプションは、SHAPESIZE組込み関数での整数オーバーフローを検出するようになりました。
      例)
        Program shape_overflow_example
          Real a(1,123456,3)
          Call sub(a)
        Contains
          Subroutine sub(x)
            Use Iso_Fortran_Env
            Real,Intent(In) :: x(:,:,:)
            Integer(int16) sh(3)
            sh = Shape(x,int16)
            Print *,sh
          End Subroutine
        End Program
      
      上記が-C=intovfを付けないでコンパイルされた場合、以下のようなナンセンスな結果となりますが
       1 -7616 3
      
      -C=intovfを付けてコンパイルした場合には、以下のような実行時エラーが発生します。
      実行時エラー: ss.f90, line 9: 組込み関数SHAPEでINTEGER(int16)オーバーフローが発生しました(真実の結果=123456)
      
    • -C=callsオプションは、手続ポインタの仮引数を、データポインタを返す関数と、 手続を返す関数(手続呼び出しのどのレベルでも)とで異なるものとして扱うようになりました。 これらのエラーは、手続が不正確な引用仕様宣言で呼び出された場合にのみ発生します。

      例)

        Subroutine sub(f,x)
          Interface
            Function f(y)
              Real,Pointer :: f
            End Function
          End Interface
          Real,Intent(In) :: x
          Real,Pointer :: p
          p => f(x)
          Print *,Associated(p)
        End Subroutine
      
      上記手続が以下のような不正確な引用仕様宣言で呼び出された場合
        Program bad
          Interface
            Subroutine sub(f,x)
              Real,External,Pointer :: f
              Real,Intent(In) :: x
            End Subroutine
          End Interface
          Real,External,Pointer :: pp
          Intrinsic sqrt
          pp => sqrt
          Call sub(pp,1.5)
        End Program
      
      -C=callsオプション (さらにトレースバックを得るには-gline) を指定すると、 以下のような実行時エラーメッセージが出力されます。(指定しない場合はセグメンテーションフォルトとなります)
      実行時エラー: sub.f90, line 1: SUBにおいて誤った引用仕様ブロックです - 仮引数F(第1番目)が手続ポインタ ではありません
      致命的なエラーでプログラムが終了しました
      sub.f90, line 1: エラーがSUBで発生しました
      bad.f90, line 11: BADから呼び出されました
      
      

    5 その他の追加機能

    • 整形ツールのオプション-idcase=-kwcase=に、 新たな選択肢が'Camel_Case'加わりました。 これは‘Capitalised’と異なり、最初の文字だけではなくアンダースコアの後の文字も大文字になります。 -kwcase=Camel_Case の場合、影響を受けるキーワードはNon_IntrinsicNon_OverridableNon_Recursive、及びOpenMPキーワードNum_Threadsです。 なお、選択肢の指定時に大文字と小文字は区別されず、Camel_Caseの場合(‘cam’と省略できる)を除いて、最初の一文字のみにまで省略する事も可能です。
    • ソース整形ツールのオプション-idcase=に新たな選択肢squote{Asis}が加わりました。 これは、ユーザー定義演算子(固有演算子は含まない)を含むすべての識別子の大文字と小文字を、 入力に現れたままの状態で保持するものです。 例えば、入力が大文字小文字の整合性が取れていない状態の“eX = Ex + 1”であった場合、 出力はそのまま全く同じ形のものとなります。 このオプションは、拡張整形ツールや他のツールでは使用できません。
    • 拡張ソース整形ツールオプション -case: は、 名前の種類によって異なる大文字・小文字の設定を可能にします。 コロンの後には、“kind=case”のカンマ区切りリストが続きます。 ここでcaseは、ケース指定 (UPPERCASElowercaseCapitalisedCamel_Case)で、 kindは以下に示すカテゴリーのうちの1つになります。
      comp 要素
      constr 構文名
      intr 組込み手続
      param パラメタ
      proc 手続
      tbp 型結合手続
      tparam 構造型パラメタ
      type 構造型
      var 変数

      例えば-case:var=lower,proc=uは変数に小文字を、手続に大文字を指定します。 特定の種類の名前に対する設定がない場合、適切なカテゴリにフォールバックします。 code{param}、typecomptparamprocはすべてvarに、 intrprocに、tbpcompproc にフォールバックされます。 ルールやフォールバックルールがない場合は、 -idcase=オプション設定(もしくはデフォルト)が使用されます。

    • 拡張ソース整形ツールオプション-casex:は、大文字小文字の規則の例外を指定します。 コロンの後に、任意の大文字・小文字指定を適用する例外文字列をカンマで区切ったリストを記述します。 例えば、-casex:MaxVal,XYz は、maxvalxyzと同等の名前が出現するたびに、 それぞれを、MaxValXYzとします。
    • -quietオプションは、コンパイラ(またはツール)のバナーメッセージと、最後の要約行を抑止します。 つまり診断メッセージのみが出力されるようになります。
    • 拡張メッセージは、それがどのような種類の拡張であるかの情報を提供するようになりました。 追加の情報は、その機能を追加したFortran標準の版 (例: “拡張(F2018)”) か、NAGの拡張か (“拡張(NAG)”)か、標準機能に取って代わられた FORTRAN77 などの古い拡張か (“非標準(廃止予定)”) のいずれかであることを示します。
    • 情報メッセージは3つのレベルに分けられました。 注意(最高)、情報、参考(最低)です。 デフォルトでは注意メッセージは出力されるようになっていますが、-w=noteオプションでこれを抑制することもできます。 -infoオプションで情報と参考の両方のメッセージを表示させることができます。

    6 外部ライブラリのサポートについて

    • Fortran Builder 7.1 は、以下の NAG ライブラリ製品をサポートします。
      • Mark 28.3, 64-bit (NLW6I283EL)
      • Mark 27.3, 64-bit (NLW6I273EL)
      • Mark 27.2, 64-bit (NLW6I272EL)
      • Mark 27.1, 64-bit (NLW6I271EL)
      • Mark 27.0, 64-bit (NLW6I27DEL)
MENU
Privacy Policy  /  Trademarks