fortran 90 の MODULE 内の変数の扱いがコンパイラによって異なっていた件について

日頃、利用している2種の fortran コンパイラ(g95と日立)で動作が異なっていたのでメモ。ミニマルのサンプルソースコードは下記。g95では sub() の動作の冒頭では b の値が不定(演算時にゼロを代入している)だが、日立では初期にゼロ, 2回目の呼出では前回の値を保持しており、SAVE属性が勝手についている動作だった。g95でも宣言部分(CONTAINSの前)に b の宣言を書くと、値を保持した。ローカルな捨て変数でも初期化をきちんと書くと安全。SAVE属性が付いたような動作だが、PROGRAM 側から変数の値は見えなかった。

      MODULE mod
        IMPLICIT REAL(8) (a-h,o-z), INTEGER(i-n)
      CONTAINS
        SUBROUTINE sub (a)
          REAL(8)::a,b
          PRINT * ,'sub() ' ,b
          b= b + a
          a= a + b
        END SUBROUTINE
      END MODULE

      PROGRAM main
        USE mod
        IMPLICIT REAL(8) (a-h,o-z), INTEGER(i-n)
        REAL(8):: c= 1.D0
        CALL sub(c)
        PRINT * ,'main()' ,c ,b ! b は見えるかな
        CALL sub(c)
        PRINT * ,'main()' ,c
      END PROGRAM