Hey everyone,
In Fedora rawhide and 42 GCC has been updated to version 15 which
introduces a switch of default C standard to gnu23. This unfortunately
causes failure to build guile 3.0.10 since it changes behavior of function
declaration without parameters described here [0]. scm_t_subr type is using
this exact behavior and thus gcc 15 fails to compile it without reverting
the standard back to the previous gnu17. I am not sure whether there is a
fix which can keep the type checking and allow different arity of functions
as is noted in comment of sct_t_subr type declaration in scm.h file.
# scm.h:812
/* The type of subrs, i.e., Scheme procedures implemented in C. Empty
function declarators are used internally for pointers to functions of
any arity. However, these are equivalent to `(void)' in C++, are
obsolescent as of C99, and trigger `strict-prototypes' GCC warnings
(bug #23681). */
#ifdef BUILDING_LIBGUILE
typedef SCM (* scm_t_subr) ();
#else
typedef void *scm_t_subr;
#endif
Error in question:
control.c: In function 'scm_init_ice_9_control':
control.c:152:23: error: passing argument 5 of 'scm_c_define_gsubr' from
incompatible pointer type [-Wincompatible-pointer-types]
152 | scm_suspendable_continuation_p);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| struct scm_unused_struct * (*)(struct
scm_unused_struct *)
In file included from control.c:29:
gsubr.h:72:71: note: expected 'scm_t_subr' {aka 'struct scm_unused_struct *
(*)(void)'} but argument is of type 'struct scm_unused_struct * (*)(struct
scm_unused_struct *)'
72 | int req, int opt, int rst,
scm_t_subr fcn);
|
~~~~~~~~~~~^~~
control.c:135:1: note: 'scm_suspendable_continuation_p' declared here
135 | scm_suspendable_continuation_p (SCM tag)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from dynstack.h:28,
from control.c:26:
../libguile/scm.h:818:16: note: 'scm_t_subr' declared here
818 | typedef SCM (* scm_t_subr) ();
| ^~~~~~~~~~
[0] -
https://gcc.gnu.org/gcc-15/porting_to.html#c23-fn-decls-without-parameters