Fortran 2003 の PROTECTED
相変わらず仕事で実装しているFortran
コンパイラの話。
で、その時の作業としては他の開発者が実装したPROTECTED
の実装を確認しておかしい部分があったら修正する、くらいのものだった。
PROTECTED
っていったらJava
のPROTECTED
みたく、継承した側でしかアクセスできないようにする修飾子でしょ?と思いつつ実装部分を見るとおかしそうなところはない。
ちゃんとPUBLIC
・PRIVATE
とは排他になっているみたいだし…
一応次のコードを書いて 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 は名前が直感に反する用語が多い気がする。