https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69759
--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> --- So it is. Thanks for the correction. The trouble is that while saying this little may be sufficient for builtins that correspond to functions fully specified elsewhere (e.g., in the C standard) it's inadequate for __builtin_alloca because the function it corresponds to has compiler-specific semantics. On Linux, for example, the alloca() man page says: The alloca() function is machine- and compiler-dependent. As an example, one important detail that I happen to be looking for is the scope of the storage obtained by __builtin_alloca: is it the whole function or just the block in which it's invoked, does it depend on the language (C vs C++), or is it subject to some compiler options? I see inconsistent behavior with the following test case (and some others like it) and I'm trying to understand what's expected: $ cat x.c && /build/gcc-trunk/gcc/xgcc -B /build/gcc-trunk/gcc -O2 -Wall -Wextra -Wpedantic -xc++ x.c && ./a.out #if __cplusplus # define alloca(N) __builtin_alloca (N) #endif void __attribute__ ((noinline, noclone)) foo (const int *p, int n) { __builtin_printf ("%s(%p, %i)\n", __func__, p, n); } void inline __attribute__ ((always_inline)) bar (int n) { foo ((int*)alloca (n), n); foo ((int*)alloca (n), n); if (n) bar (n - 1); } int main (void) { bar (1); } x.c: In function ‘void foo(const int*, int)’: x.c:6:51: warning: format ‘%p’ expects argument of type ‘void*’, but argument 3 has type ‘const int*’ [-Wformat=] __builtin_printf ("%s(%p, %i)\n", __func__, p, n); ^ foo(0x3fffd7129da0, 1) foo(0x3fffd7129d90, 1) foo(0x3fffd7129d90, 0) foo(0x3fffd7129d90, 0)