https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119419
Bug ID: 119419 Summary: C prototype generation for functions returning C_FUNPTR incorrect Product: gcc Version: 14.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: ryan.gambord at oregonstate dot edu Target Milestone: --- Created attachment 60849 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60849&action=edit Collected source files When compiled with -fc-prototypes, the emitted function signature is incorrect, ==> MRE.f90 <== function f(idx) bind(C) use, intrinsic :: ISO_C_BINDING type(C_FUNPTR) :: f integer(C_INT) :: idx end function f ====== Emits `int (*f()) (int)` rather than `int (*f(int)) ()` I have attached a sample fortran "library" and C program that illustrates the issue: ==> lookup.f90 <== MODULE test USE, INTRINSIC :: ISO_C_BINDING CONTAINS FUNCTION lookup(idx) BIND(C) type(C_FUNPTR) :: lookup integer(C_INT), VALUE :: idx SELECT CASE (idx) CASE (1) lookup = C_FUNLOC(x1) CASE (2) lookup = C_FUNLOC(x2) CASE DEFAULT lookup = C_NULL_FUNPTR end SELECT END FUNCTION lookup subroutine x1() print *, "x1" end subroutine x1 subroutine x2() print *, "x2" end subroutine x2 END MODULE test ==> test.c <== #include <stdio.h> /* Incorrect prototype */ /* #include "lookup.h" */ /* Correct function prototype */ void (*lookup(int))(); int main() { lookup(1)(); /* "x1" */ lookup(2)(); /* "x2" */ } The generated function prototype in lookup.h is: `int (*lookup()) (int idx);`