Subject: Re: bug#70889: 29.3; GCC14.1 MinGW compilation error

From: Eli Zaretskii <[email-masked]>
Date: Sun, 12 May 2024 13:31:34 +0300

> Date: Sun, 12 May 2024 09:29:02 +0200
> From: Cyril Arnould <[email-masked]>
> 
> I wanted to check how the MinGW related issues #63365 and #63752 behave
> under GCC 14.1, however I did not get that far. Running the following:
> 
> 
> git clone https://git.savannah.gnu.org/git/emacs.git
> cd emacs
> ./autogen.sh
> ./configure
> make
> 
> 
> I get the error:
> 
> 
> sysdep.c: In function 'get_child_status':
> sysdep.c:479:13: error: implicit declaration of function 'waitpid' 
> [-Wimplicit-function-declaration]
>    479 |       pid = waitpid (child, status, options);
>        |             ^~~~~~~
> sysdep.c:479:13: warning: nested extern declaration of 'waitpid' 
> [-Wnested-externs]

I don't understand how this happens.  sysdep.c includes syswait.h:

  #include "syswait.h"

syswait.h does this:

  #ifdef HAVE_SYS_WAIT_H	/* We have sys/wait.h with POSIXish definitions.  */
  #include <sys/wait.h>
  #endif  /* !HAVE_SYS_WAIT_H */

The MS-Windows build does define HAVE_SYS_WAIT_H:

  /* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
  #define HAVE_SYS_WAIT_H 1

because we have the emulation of that header in nt/inc/sys/wait.h, and
the compiler flags include that directory, see src/Makefile:

  CPPFLAGS = -mtune=pentium4   -DUSE_CRT_DLL=1 -I ${abs_top_srcdir}/nt/inc

So why doesn't this work in your case? which of the above parts of the
puzzle doesn't work?

> sysdep.c: In function 'child_status_changed':
> sysdep.c:525:43: error: 'WNOHANG' undeclared (first use in this function)
>    525 |   return get_child_status (child, status, WNOHANG | options, 0);
>        |                                           ^~~~~~~
> sysdep.c:525:43: note: each undeclared identifier is reported only once 
> for each function it appears in
> sysdep.c:526:1: warning: control reaches end of non-void function 
> [-Wreturn-type]

Same here: WNOHANG is defined in nt/inc/sys/wait.h.

> Currently I'm on commit 67b1da215c9. According to the GCC 14 porting
> page "It is no longer possible to call a function that has not been
> declared", so I guess that's the issue here. I've noticed that in
> src/syswait.c, <sys/wait.h> is only included if HAVE_SYS_WAIT_H is
> defined, which it isn't.

So please try to figure out how come HAVE_SYS_WAIT_H is not defined in
your case.  It should be.  The first place to look is in config.log.
In my case I have

  configure:14468: checking for sys/wait.h that is POSIX.1 compatible
  configure:14501: result: yes

> For the record, I run into an internal compiler issue in thread.c
> after that, but that's not on emacs to solve I guess.

Internal compiler errors are GCC bugs, yes.