giantneco’s blog

技術メモ

Fortran 2003 の PROTECTED

相変わらず仕事で実装しているFortranコンパイラの話。

で、その時の作業としては他の開発者が実装したPROTECTEDの実装を確認しておかしい部分があったら修正する、くらいのものだった。 PROTECTEDっていったらJavaPROTECTEDみたく、継承した側でしかアクセスできないようにする修飾子でしょ?と思いつつ実装部分を見るとおかしそうなところはない。 ちゃんとPUBLICPRIVATEとは排他になっているみたいだし…

一応次のコードを書いて gfortran とエラー出力を比較してみることにした。

MODULE m
   INTEGER, PUBLIC, PROTECTED :: i
END MODULE m

ところがこのコードはパスしてしまう。Fortran の仕様書を見てみると次のようにあった。

A nonpointer object that has the PROTECTED attribute and is accessed by
use association shall not appear in a variable definition context (16.6.7) or
as the data-target or proc-target in a pointer-assignment-stmt.

要するに、参照結合した(つまり USE して見えるようになった)変数にPROTECTEDが付いていると代入が出来なくなるとのこと。 結局最初にされていた実装はかなり仕様から外れていることが分かったのでそこそこの量を修正することになった。

やっぱりどうも Fortran は名前が直感に反する用語が多い気がする。