call by value !?
Fortran の副プログラムの引数は、call by reference がデフォルトですが、Fortran 2003 で引数に value 属性が加わり、call by value 型の扱いも出来るようになりました。特に副プログラムに bind(c) の属性もつけてやることで、C 言語との互換もとれるようになりました。
ここで bind(c) を付けなかった場合に、value 属性の引数がどうなるのか気になる所です。Dr. Fortran こと Steve Lionel のコラムによると、intel fortran では呼び出し側でコピーを取って、そのコピーを call by referecnce で渡すそうです。これは FORTRAN 77 時代のテクニックで式を実引数にすると、その結果をテンポラリにコピーしてそれを call by reference で渡すのと同じになっています。次のようなものがその例になります。
call sub((3))
ところが、compiler explorer を見ると gfortran では value 属性の引数は bind(c) したときと同じように値を送っているように見えます。
もう少し詳しく調べてみたいところですが、とりあえず色々あるんだなとメモっておくことにします。
module test_m implicit none contains subroutine sub1(x) real, intent(in) :: x print *, loc(x) ! non-standard end subroutine sub1 subroutine sub2(x) real, value :: x print *, loc(x) ! non-standard end subroutine sub2 subroutine sub3(x) bind(c) real, value :: x print *, loc(x) ! non-standard end subroutine sub3 end module test_m program test01 use test_m implicit none real :: stack stack = 1.0 call sub1(stack) call sub1((stack)) call sub2(stack) call sub3(stack) end program test01