I got this error:
$ nvfortran -c dmpinf.f90 -o dmpinf.f90.o
NVFORTRAN-F-0000-Internal compiler error. Error in c_f_pointer() - unable to find c_ptr type 144 (dmpinf.f90: 28)
NVFORTRAN/x86-64 Linux 21.3-0: compilation aborted
on the following file:
module definitions
use, intrinsic :: iso_fortran_env, only: int64, real64
use, intrinsic :: iso_c_binding, only: c_double
implicit none
private
public :: wp, iwp, cdp
integer(kind=int64), parameter :: iwp = int64
integer(kind=iwp), parameter :: wp = real64, cdp = c_double
end module definitions
subroutine DmpInf()
use definitions
implicit none
integer :: lRFStrt
call DmpInf_Internal(lRFStrt)
contains
subroutine DmpInf_Internal(lRFStrt)
use, intrinsic :: iso_c_binding, only: c_f_pointer, c_loc
integer, target :: lRFStrt
integer, pointer :: p_lRF
call c_f_pointer(c_loc(lRFStrt),p_lRF)
nullify(p_lRF)
end subroutine DmpInf_Internal
end subroutine DmpInf
The problem disappears if definitions
is not used (but note no variable from it is referenced), or if iso_c_binding
is not used inside definitions
(but note those are private). It also disappears if the internal subroutine is moved into the main one, but this of course is just a reduction of a much more complex program where that is not possible.
I tested with version:
$ nvfortran --version
nvfortran 21.3-0 LLVM 64-bit target on x86-64 Linux -tp skylake
NVIDIA Compilers and Tools
Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.
Other compilers seem to have to problem with this. I haven’t been able to find a workaround.