> Cc: bug-gnulib@gnu.org > From: Paul Eggert <egg...@cs.ucla.edu> > Date: Sun, 17 Feb 2019 13:09:06 -0800 > > Eli Zaretskii wrote: > > #ifndef alloca > > # ifdef __GNUC__ > > -# define alloca __builtin_alloca > > +# if HAVE_ALLOCA_H > > +# include_next <alloca.h> > > +# else > > +# define alloca __builtin_alloca > > +# endif > > # elif defined _AIX > > Why do the 'include_next' only for GCC? Why not do it for all compilers?
I didn't know other compilers supported include_next. > Also, what platforms don't work with the current Gnulib alloca module, and > why? I bumped into this with mingw.org's MinGW, which introduced alloca.h in its recent versions. (MinGW64 doesn't have this header.) This new MinGW alloca.h does this: __CRT_ALIAS void *alloca( size_t __n ){ return __builtin_alloca( __n ); } which makes alloca an always-inline function by virtue of # define __CRT_INLINE extern __inline__ # define __CRT_ALIAS __CRT_INLINE __attribute__((__always_inline__)) The other part of the puzzle is that stdlib.h does this: # include "alloca.h" so Gnulib's alloca.h is bypassed. Which causes this when compiling Gnulib's vasnprintf.c: In file included from vasnprintf.c:57:0: d:\usr\include\alloca.h: In function 'vasnprintf': ./alloca.h:40:18: error: inlining failed in call to always_inline '__builtin_alloca': function not considered for inlining # define alloca __builtin_alloca ^ In file included from d:\usr\include\stdlib.h:499:0, from vasnprintf.c:71: d:\usr\include\alloca.h:62:48: note: called from here __CRT_ALIAS void *alloca( size_t __n ){ return __builtin_alloca( __n ); } ^~~~~~~~~~~~~~~~~~~~~~~ Makefile:945: recipe for target `vasnprintf.lo' failed