Fortran function return value polymorphism

Apologies. Click below for a full example of the workaround I had in mind:

Click here
module eye_mod

  implicit none

  integer, parameter :: sp = kind(1.0e0)
  integer, parameter :: dp = kind(1.0d0)

  interface eye
    module procedure eye_default
    module procedure eye_sp
    module procedure eye_dp
  end interface

contains

  function eye_default(n) result(res)
    integer, intent(in) :: n
    real(sp) :: res(n,n)
    integer :: k
    res = 0
    do k = 1, n
      res(k,k) = 1
    end do
  end function

  function eye_sp(n,i) result(res)
    integer, intent(in) :: n
    real(sp), intent(in) :: i
    real(kind(i)) :: res(n,n)
    integer :: k
    res = 0
    do k = 1, n
      res(k,k) = 1
    end do
  end function

  function eye_dp(n,i) result(res)
    integer, intent(in) :: n
    real(dp), intent(in) :: i
    real(kind(i)) :: res(n,n)
    integer :: k
    res = 0
    do k = 1, n
      res(k,k) = 1
    end do
  end function

end module

The main program would look something like:

program test_eye

  use eye_mod, only: eye, wp => dp

  implicit none

  ! Dummy variable used to select precision
  real(wp), parameter :: dum_wp = 1.0_wp

  integer, parameter :: n = 3
  real(wp) :: I(n,n)
  integer :: k

  I = eye(n,dum_wp)

  do k = 1, n
    print *, I(k,:)
  end do

end program
2 Likes