[R-SIG-Mac] WRE advice about alloca portability seems incomplete or out-of-date

Mikael Jagan j@g@nmn2 @end|ng |rom gm@||@com
Mon Sep 16 02:02:26 CEST 2024


R-exts provides some header preamble for using alloca() and suggests that it
"suffices for known R platforms", with the caveat that it "should be included
before standard C headers such as stdlib.h".  But attempting to compile a
minimal program using Xcode 15.3 with macOS 14.4 SDK, including the preamble
followed by stdlib.h, results in an error:

     Source:

     #include <Rconfig.h> // for HAVE_ALLOCA_H
     #ifdef __GNUC__
     // this covers gcc, clang, icc
     # undef alloca
     # define alloca(x) __builtin_alloca((x))
     #elif defined(HAVE_ALLOCA_H)
     // needed for native compilers on Solaris and AIX
     # include <alloca.h>
     #endif
     #include <stdlib.h>
     int main()
     {
         return 0;
     }

     Output:

     $ clang -I"`R RHOME`/include" test.c -o test.o
     In file included from test.c:11:
     In file included from 
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h:68:
 
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/alloca.h:32:7: 
error: conflicting types for '__builtin_alloca'
     void    *alloca(size_t);                /* built-in for gcc */
              ^
     test.c:5:20: note: expanded from macro 'alloca'
     # define alloca(x) __builtin_alloca((x))
                        ^
 
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/alloca.h:32:7: 
note: '__builtin_alloca' is a builtin with type 'void *(unsigned long)'
     test.c:5:20: note: expanded from macro 'alloca'
     # define alloca(x) __builtin_alloca((x))
                        ^
     1 error generated.

where it seems that the macro alloca() defined at line 5 is expanded in
alloca.h, producing a nonsense declaration there.  I conclude that the currently
documented advice is not quite portable here ...

I know that I can just prefix identifier as below:

     #include <Rconfig.h> // for HAVE_ALLOCA_H
     #ifdef __GNUC__
     // this covers gcc, clang, icc
     # define prefixed_alloca(x) __builtin_alloca((x))
     #else
     # ifdef HAVE_ALLOCA_H
     // needed for native compilers on Solaris and AIX
     #  include <alloca.h>
     # endif
     # define prefixed_alloca(x) alloca((x))
     #endif

but if there is another way to remain portable, then perhaps it could be
documented.

Mikael



More information about the R-SIG-Mac mailing list