program test
   implicit none ! implicit は諸悪の根源なので無効化
   intrinsic dsin ! 組み込み関数は intrinsic 宣言
   double precision bar ! 型チェックのため、一応戻り値の型を指定しておくのが良い
   external bar ! 自分で定義した関数は external 宣言
    call f(dsin) ! 普通に関数に渡す
    call f(bar)
    stop
   end

   ! 自分で定義した関数
   double precision function bar(a)
   implicit none
   double precision a
    bar = dsin(a)
    return
   end

   subroutine f(func)
   implicit none
   double precision func ! 普通に戻り値の型を指定しておいて、
   double precision pi
   parameter(pi = 3.141592653589793D+0)
    write(*,*) func(pi) ! 普通に呼べばよい
    return
   end
   ! 関数でなくサブルーチンの時は戻り値の型の指定は不要