https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119889
Bug ID: 119889 Summary: Internal compiler error using bind(C) functionality Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: juergen.reuter at desy dot de Target Milestone: --- Created attachment 61169 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61169&action=edit Reproducer The following code below (and attached) triggers an internal compiler error. I do believe that there is something fishy with that code as it also triggers an ICE with ifx and Nagfor: gfortran -c ol_interface.f90 ol_interface.f90:59:63: 59 | tmp_fun => dlsym(lib, "ol_f_n_external_" // trim(proc)) | 1 internal compiler error: in gfc_typenode_for_spec, at fortran/trans-types.c:1124 0x7fa63338ad8f __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 0x7fa63338ae3f __libc_start_main_impl ../csu/libc-start.c:392 Reproducer: module ol_dlfcn use, intrinsic :: iso_c_binding, only: c_char, c_ptr, c_funptr, & & c_null_char, c_associated, c_f_procpointer implicit none private public :: dlsym interface function c_dlsym(lib, sym) bind(c,name="dlsym") ! void *dlsym(void *lib, const char *sym); use, intrinsic :: iso_c_binding, only: c_ptr, c_char, c_funptr implicit none type(c_ptr), value :: lib character(kind=c_char), dimension(*), intent(in) :: sym type(c_funptr) :: c_dlsym end function c_dlsym end interface contains function dlsym(lib, sym, fatal) result(f_funp) ! fatal: 0=silent (default), 1=warning, 2=error implicit none type(c_ptr), intent(in) :: lib character(len=*), intent(in) :: sym integer, intent(in), optional :: fatal type(c_funptr) :: c_funp procedure(), pointer :: f_funp c_funp = c_dlsym(lib, trim(sym) // c_null_char) if (c_associated(c_funp)) then call c_f_procpointer(c_funp, f_funp) else f_funp => null() end if end function dlsym end module ol_dlfcn module openloops use, intrinsic :: iso_c_binding, only: c_ptr, c_null_ptr implicit none private type process_handle type(c_ptr) :: library_handle = c_null_ptr end type process_handle contains function get_process_handle(lib, proc) use ol_dlfcn, only: dlsym implicit none type(c_ptr), intent(in) :: lib character(len=*), intent(in) :: proc type(process_handle) :: get_process_handle procedure(dlsym), pointer :: tmp_fun ! number of external particles !!! Triggres the ICE tmp_fun => dlsym(lib, "ol_f_n_external_" // trim(proc)) end function get_process_handle end module openloops