1*820c1a8dSHiroo HAYASHIdnl 'extern inline' a la ISO C99. 2*820c1a8dSHiroo HAYASHI 3*820c1a8dSHiroo HAYASHIdnl Copyright 2012-2021 Free Software Foundation, Inc. 4*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation 5*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it, 6*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved. 7*820c1a8dSHiroo HAYASHI 8*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_EXTERN_INLINE], 9*820c1a8dSHiroo HAYASHI[ 10*820c1a8dSHiroo HAYASHI AH_VERBATIM([extern_inline], 11*820c1a8dSHiroo HAYASHI[/* Please see the Gnulib manual for how to use these macros. 12*820c1a8dSHiroo HAYASHI 13*820c1a8dSHiroo HAYASHI Suppress extern inline with HP-UX cc, as it appears to be broken; see 14*820c1a8dSHiroo HAYASHI <https://lists.gnu.org/r/bug-texinfo/2013-02/msg00030.html>. 15*820c1a8dSHiroo HAYASHI 16*820c1a8dSHiroo HAYASHI Suppress extern inline with Sun C in standards-conformance mode, as it 17*820c1a8dSHiroo HAYASHI mishandles inline functions that call each other. E.g., for 'inline void f 18*820c1a8dSHiroo HAYASHI (void) { } inline void g (void) { f (); }', c99 incorrectly complains 19*820c1a8dSHiroo HAYASHI 'reference to static identifier "f" in extern inline function'. 20*820c1a8dSHiroo HAYASHI This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16. 21*820c1a8dSHiroo HAYASHI 22*820c1a8dSHiroo HAYASHI Suppress extern inline (with or without __attribute__ ((__gnu_inline__))) 23*820c1a8dSHiroo HAYASHI on configurations that mistakenly use 'static inline' to implement 24*820c1a8dSHiroo HAYASHI functions or macros in standard C headers like <ctype.h>. For example, 25*820c1a8dSHiroo HAYASHI if isdigit is mistakenly implemented via a static inline function, 26*820c1a8dSHiroo HAYASHI a program containing an extern inline function that calls isdigit 27*820c1a8dSHiroo HAYASHI may not work since the C standard prohibits extern inline functions 28*820c1a8dSHiroo HAYASHI from calling static functions (ISO C 99 section 6.7.4.(3). 29*820c1a8dSHiroo HAYASHI This bug is known to occur on: 30*820c1a8dSHiroo HAYASHI 31*820c1a8dSHiroo HAYASHI OS X 10.8 and earlier; see: 32*820c1a8dSHiroo HAYASHI https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html 33*820c1a8dSHiroo HAYASHI 34*820c1a8dSHiroo HAYASHI DragonFly; see 35*820c1a8dSHiroo HAYASHI http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log 36*820c1a8dSHiroo HAYASHI 37*820c1a8dSHiroo HAYASHI FreeBSD; see: 38*820c1a8dSHiroo HAYASHI https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html 39*820c1a8dSHiroo HAYASHI 40*820c1a8dSHiroo HAYASHI OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and 41*820c1a8dSHiroo HAYASHI for clang but remains for g++; see <https://trac.macports.org/ticket/41033>. 42*820c1a8dSHiroo HAYASHI Assume DragonFly and FreeBSD will be similar. 43*820c1a8dSHiroo HAYASHI 44*820c1a8dSHiroo HAYASHI GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 45*820c1a8dSHiroo HAYASHI inline semantics, unless -fgnu89-inline is used. It defines a macro 46*820c1a8dSHiroo HAYASHI __GNUC_STDC_INLINE__ to indicate this situation or a macro 47*820c1a8dSHiroo HAYASHI __GNUC_GNU_INLINE__ to indicate the opposite situation. 48*820c1a8dSHiroo HAYASHI GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline 49*820c1a8dSHiroo HAYASHI semantics but warns, unless -fgnu89-inline is used: 50*820c1a8dSHiroo HAYASHI warning: C99 inline functions are not supported; using GNU89 51*820c1a8dSHiroo HAYASHI warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute 52*820c1a8dSHiroo HAYASHI It defines a macro __GNUC_GNU_INLINE__ to indicate this situation. 53*820c1a8dSHiroo HAYASHI */ 54*820c1a8dSHiroo HAYASHI#if (((defined __APPLE__ && defined __MACH__) \ 55*820c1a8dSHiroo HAYASHI || defined __DragonFly__ || defined __FreeBSD__) \ 56*820c1a8dSHiroo HAYASHI && (defined __header_inline \ 57*820c1a8dSHiroo HAYASHI ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \ 58*820c1a8dSHiroo HAYASHI && ! defined __clang__) \ 59*820c1a8dSHiroo HAYASHI : ((! defined _DONT_USE_CTYPE_INLINE_ \ 60*820c1a8dSHiroo HAYASHI && (defined __GNUC__ || defined __cplusplus)) \ 61*820c1a8dSHiroo HAYASHI || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \ 62*820c1a8dSHiroo HAYASHI && defined __GNUC__ && ! defined __cplusplus)))) 63*820c1a8dSHiroo HAYASHI# define _GL_EXTERN_INLINE_STDHEADER_BUG 64*820c1a8dSHiroo HAYASHI#endif 65*820c1a8dSHiroo HAYASHI#if ((__GNUC__ \ 66*820c1a8dSHiroo HAYASHI ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \ 67*820c1a8dSHiroo HAYASHI : (199901L <= __STDC_VERSION__ \ 68*820c1a8dSHiroo HAYASHI && !defined __HP_cc \ 69*820c1a8dSHiroo HAYASHI && !defined __PGI \ 70*820c1a8dSHiroo HAYASHI && !(defined __SUNPRO_C && __STDC__))) \ 71*820c1a8dSHiroo HAYASHI && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) 72*820c1a8dSHiroo HAYASHI# define _GL_INLINE inline 73*820c1a8dSHiroo HAYASHI# define _GL_EXTERN_INLINE extern inline 74*820c1a8dSHiroo HAYASHI# define _GL_EXTERN_INLINE_IN_USE 75*820c1a8dSHiroo HAYASHI#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \ 76*820c1a8dSHiroo HAYASHI && !defined _GL_EXTERN_INLINE_STDHEADER_BUG) 77*820c1a8dSHiroo HAYASHI# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__ 78*820c1a8dSHiroo HAYASHI /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */ 79*820c1a8dSHiroo HAYASHI# define _GL_INLINE extern inline __attribute__ ((__gnu_inline__)) 80*820c1a8dSHiroo HAYASHI# else 81*820c1a8dSHiroo HAYASHI# define _GL_INLINE extern inline 82*820c1a8dSHiroo HAYASHI# endif 83*820c1a8dSHiroo HAYASHI# define _GL_EXTERN_INLINE extern 84*820c1a8dSHiroo HAYASHI# define _GL_EXTERN_INLINE_IN_USE 85*820c1a8dSHiroo HAYASHI#else 86*820c1a8dSHiroo HAYASHI# define _GL_INLINE static _GL_UNUSED 87*820c1a8dSHiroo HAYASHI# define _GL_EXTERN_INLINE static _GL_UNUSED 88*820c1a8dSHiroo HAYASHI#endif 89*820c1a8dSHiroo HAYASHI 90*820c1a8dSHiroo HAYASHI/* In GCC 4.6 (inclusive) to 5.1 (exclusive), 91*820c1a8dSHiroo HAYASHI suppress bogus "no previous prototype for 'FOO'" 92*820c1a8dSHiroo HAYASHI and "no previous declaration for 'FOO'" diagnostics, 93*820c1a8dSHiroo HAYASHI when FOO is an inline function in the header; see 94*820c1a8dSHiroo HAYASHI <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and 95*820c1a8dSHiroo HAYASHI <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>. */ 96*820c1a8dSHiroo HAYASHI#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__ 97*820c1a8dSHiroo HAYASHI# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ 98*820c1a8dSHiroo HAYASHI# define _GL_INLINE_HEADER_CONST_PRAGMA 99*820c1a8dSHiroo HAYASHI# else 100*820c1a8dSHiroo HAYASHI# define _GL_INLINE_HEADER_CONST_PRAGMA \ 101*820c1a8dSHiroo HAYASHI _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"") 102*820c1a8dSHiroo HAYASHI# endif 103*820c1a8dSHiroo HAYASHI# define _GL_INLINE_HEADER_BEGIN \ 104*820c1a8dSHiroo HAYASHI _Pragma ("GCC diagnostic push") \ 105*820c1a8dSHiroo HAYASHI _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \ 106*820c1a8dSHiroo HAYASHI _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \ 107*820c1a8dSHiroo HAYASHI _GL_INLINE_HEADER_CONST_PRAGMA 108*820c1a8dSHiroo HAYASHI# define _GL_INLINE_HEADER_END \ 109*820c1a8dSHiroo HAYASHI _Pragma ("GCC diagnostic pop") 110*820c1a8dSHiroo HAYASHI#else 111*820c1a8dSHiroo HAYASHI# define _GL_INLINE_HEADER_BEGIN 112*820c1a8dSHiroo HAYASHI# define _GL_INLINE_HEADER_END 113*820c1a8dSHiroo HAYASHI#endif]) 114*820c1a8dSHiroo HAYASHI]) 115