Hi gmp maintainers, The #ifdefs for determining which variant of 'inline' or 'extern inline' don't work any more with the Apple GCC compiler on MacOS X.
See the threads that started in http://lists.gnu.org/archive/html/bug-gnulib/2008-04/msg00103.html http://lists.gnu.org/archive/html/bug-gnulib/2008-04/msg00079.html Ludovic Courtès wrote: > > + #ifdef __GNUC_STDC_INLINE__ > > + #define __GMP_EXTERN_INLINE extern __inline__ __attribute__ > > ((__gnu_inline__)) > > Unfortunately that doesn't work on MacOS X because Apple's GCC (labeled > "4.0") implements C99 inline semantics but > > 1. Does not define `__GNUC_STDC_INLINE__'. > 2. Does not support `__gnu_inline__'. Right. We have looked at Apple GCC version 4.0.1 build 5465 (the one used for MacOS X 10.5.*) and 5479 (a further development). - They implement 'inline' with ISO C99 semantics when -std=c99 or -std=gnu99 is specified (like GCC >= 4.3). - They warn about an ignored attribute if __attribute__((__gnu_inline__)) is used (like GCC < 4.2). - Build 5479 defines __GNUC_STDC_INLINE__ or __GNUC_GNU_INLINE__, respectively, to indicate whether the ISO C99 or the old GCC semantics of 'inline' is in effect. Build 5465 does not define these symbols. The code in gmp-4.2.2 has two problems: 1) The "#ifdef __GNUC_STDC_INLINE__" test evaluates to true on Apple GCC version 4.0.1 build 5479 when std=c99 or -std=gnu99 is specified, but __attribute__ ((__gnu_inline__)) is unsupported in this case. 2) The "#else" test evaluates to true test evaluates to true on Apple GCC version 4.0.1 build 5465 when std=c99 or -std=gnu99 is specified, but 'extern __inline__' uses the ISO C99 semantics, not the old GCC semantics in this case. Here is a suggested fix. The only part I'm not sure about is whether __GMP_INLINE_PROTOTYPES should be defined or not when __GMP_EXTERN_INLINE is not defined. 2008-04-11 Bruno Haible <[EMAIL PROTECTED]> * gmp-h.in (__GMP_EXTERN_INLINE): Adjust conditions to work also for Apple MacOS X compilers. Reported by Ludovic Courtès <[EMAIL PROTECTED]> and Peter O'Gorman <[EMAIL PROTECTED]>. --- gmp-h.in.bak 2007-09-03 18:05:40.000000000 +0200 +++ gmp-h.in 2008-04-12 03:46:18.000000000 +0200 @@ -1,7 +1,7 @@ /* Definitions for GNU multiple precision functions. -*- mode: c -*- Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, -2004, 2005, 2006, 2007 Free Software Foundation, Inc. +2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -418,15 +418,23 @@ for an inline too, so as to correctly specify "dllimport" on windows, in case the function is called rather than inlined. GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 - inline semantics, unless -fgnu89-inline is used. */ + inline semantics, unless -fgnu89-inline is used. + GCC 4.2 and above support __inline__ __attribute__ ((__gnu_inline__)) + to designate the old GCC inline semantics. + Apple CC 4.0.1 build 5465 with -std=c99 or -std=gnu99 implements ISO C99 + inline semantics, but does not set __GNUC_STDC_INLINE__. + Apple CC 4.0.1 build 5465 or later, without -std=c99 or -std=gnu99, + implements the old GCC inline semantics. Build 5479 sets + __GNUC_GNU_INLINE__, build 5465 does not. */ #ifdef __GNUC__ -#ifdef __GNUC_STDC_INLINE__ +#ifdef __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) #define __GMP_EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__)) -#else +#define __GMP_INLINE_PROTOTYPES 1 +#elif !(defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && __STDC_VERSION__ >= 199901L) #define __GMP_EXTERN_INLINE extern __inline__ -#endif #define __GMP_INLINE_PROTOTYPES 1 #endif +#endif /* DEC C (eg. version 5.9) supports "static __inline foo()", even in -std1 strict ANSI mode. Inlining is done even when not optimizing (ie. -O0