fortran66のブログ

fortran について書きます。

【メモ帳】gfortran: elemental function automatic array ??

gfortran の elemental function で automatic array 取れない

Intel fortran では通るので、gfortran のバグかも知れないが、Intel fortran は gfortran 以上に文法にガバガバだしw

elemental でなければ pure でも通る。impure でも elemental つけると通らない。意味的には elemental で困る点は無いが、elemental subroutine/function の制約かも知れない。文法書をみてもすぐには分からない。 gfortran-7 でも -8 でも -9 でも引っかかる。

binder output

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained: Incorporating Fortran 2018 (Numerical Mathematics and Scientific Computation)

ASCII 出力

%compiler: gfortran-9
module m_divisor
    implicit none
contains
    pure integer function ifun(n) 
        integer, intent(in) :: n
        integer :: k(n) 
        k = 1
        ifun = sum(k)
    end function ifun 
end module m_divisor

program test
    use m_divisor
    implicit none
    print *, ifun(10)
    stop 'normal end'
end program test
          10


STOP normal end
%compiler: gfortran-9
module m_divisor
    implicit none
contains
    pure elemental integer function ifun(n) 
        integer, intent(in) :: n
        integer :: k(n) 
        k = 1
        ifun = sum(k)
    end function ifun 
end module m_divisor

program test
    use m_divisor
    implicit none
    print *, ifun(10)
    stop 'normal end'
end program test
/mnt/d/ubuntu18/binder/modern_fortran/examples/temp/tmpih_fplg0.f90:6:21:

    6 |         integer :: k(n)
      |                     1
Error: Dummy argument ‘n’ not allowed in expression at (1)
/mnt/d/ubuntu18/binder/modern_fortran/examples/temp/tmpih_fplg0.f90:6:21:

    6 |         integer :: k(n)
      |                     1
Error: Dummy argument ‘n’ not allowed in expression at (1)
/mnt/d/ubuntu18/binder/modern_fortran/examples/temp/tmpih_fplg0.f90:13:8:

   13 |     use m_divisor
      |        1
Fatal Error: Cannot open module file ‘m_divisor.mod’ for reading at (1): No such file or directory
compilation terminated.


[gfort kernel] fortran exited with code 1, the executable will not be executed