Greetings,

The Fedora project is rebuilding all packages with a prerelease of GCC
15.  This version of GCC changes the default C standard from C17 to
C23.  Two C23 changes have been causing a lot of build failures, and
also affect gcl.

First, "bool", "true", and "false" are now keywords of the language;
i.e., "#include <stdbool.h>" has become a no-op.  One consequence is
that this code in h/lu.h is now illegal:

#undef bool
typedef int bool;

Since bool is a language keyword, not a preprocessor macro, the #undef
has no effect, and you can't create a typedef for a builtin type, so
that is a compiler error.  (There is another such typedef in
bin/dpp.c.)

Second, in C17 and earlier, function declarations of the form "t f();"
mean that f is a function that returns type t and has an unspecified
parameter list.  In C23, such a declaration has the same meaning as "t
f(void);"; i.e., it asserts that f takes zero arguments.  This leads
to build errors like this:

In file included from ../h/include.h:119,
                 from typespec.c:29:
../h/../h/protoize.h:64:41: error: conflicting types for
‘clear_compiler_properties’; have ‘union lispunion *(union lispunion
*, union lispunion *)’
   64 | /* assignment.c:547:OF */ extern object
clear_compiler_properties (object sym, object code); /* (sym, code)
object sym; object code; */
      |                                         ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ../h/include.h:112:
../h/../h/object.h:532:8: note: previous declaration of
‘clear_compiler_properties’ with type ‘union lispunion *(void)’
  532 | object clear_compiler_properties();
      |        ^~~~~~~~~~~~~~~~~~~~~~~~~

I attempted to work around the issue for now by adding -std=gnu17 to
the build flags, but that still fails:

../bin/dpp.c:84:13: error: ‘bool’ cannot be defined via ‘typedef’
   84 | typedef int bool;
      |             ^~~~
../bin/dpp.c:84:13: note: ‘bool’ is a keyword with ‘-std=c23’ onwards
../bin/dpp.c:84:1: warning: useless type name in empty declaration
   84 | typedef int bool;
      | ^~~~~~~

The problem is that the C compiler is invoked without user CFLAGS in 3
places, each time defaulting to C23 mode.  The attached patch, plus
explicitly specifying the C standard as C17 or earlier, works around
the issue.
--
Jerry James
http://www.jamezone.org/
--- gcl-2.6.14/makefile.orig	2023-01-17 11:57:22.238144438 -0700
+++ gcl-2.6.14/makefile	2025-01-21 13:35:13.618595528 -0700
@@ -269,12 +269,12 @@ $(HDIR)new_decl.h:
 $(HDIR)mcompdefs.h: $(HDIR)compdefs.h $(HDIR)new_decl.h
 	cat $< |\
 	$(AWK) 'BEGIN {print "#include \"include.h\"";print "#include \"cmponly.h\"";print "---"} {a=$$1;gsub("\\.\\.\\.","",a);print "\"#define " $$1 "\" " a}' |\
-	$(CC) -E -P -I./$(HDIR) - |\
+	$(CC) $(CFLAGS) -E -P -I./$(HDIR) - |\
 	$(AWK) '/^\-\-\-$$/ {i=1;next} {if (!i) next} {gsub("\"","");print}' >$@
 
 $(HDIR)cmpinclude.h: $(HDIR)mcompdefs.h $(CMPINCLUDE_FILES) $(HDIR)config.h
 	cp $< $(@F)
-	cat $(CMPINCLUDE_FILES) | $(CC) -E -I./$(HDIR) - | $(AWK) '/^# |^$$|^#pragma/ {next}{print}' >> $(@F)
+	cat $(CMPINCLUDE_FILES) | $(CC) $(CFLAGS) -E -I./$(HDIR) - | $(AWK) '/^# |^$$|^#pragma/ {next}{print}' >> $(@F)
 	./xbin/move-if-changed mv $(@F) $@
 	./xbin/move-if-changed cp $@ o/$(@F)
 
--- gcl-2.6.14/o/makefile.orig	2025-01-21 10:23:02.846520809 -0700
+++ gcl-2.6.14/o/makefile	2025-01-21 13:55:45.962921794 -0700
@@ -70,7 +70,7 @@ boot.h: boot.ini
 	rm $*.c
 
 $(DPP):	../bin/dpp.c
-	${CC} ${DEFS} -o $@ $<
+	${CC} ${CFLAGS} ${DEFS} -o $@ $<
 
 new_init.c: ${INI_FILES}
 	echo '#include "make-init.h"' > $@

Reply via email to