Blame m4/extern-inline.m4

Packit 33f14e
dnl 'extern inline' a la ISO C99.
Packit 33f14e
Packit 33f14e
dnl Copyright 2012-2017 Free Software Foundation, Inc.
Packit 33f14e
dnl This file is free software; the Free Software Foundation
Packit 33f14e
dnl gives unlimited permission to copy and/or distribute it,
Packit 33f14e
dnl with or without modifications, as long as this notice is preserved.
Packit 33f14e
Packit 33f14e
AC_DEFUN([gl_EXTERN_INLINE],
Packit 33f14e
[
Packit 33f14e
  AH_VERBATIM([extern_inline],
Packit 33f14e
[/* Please see the Gnulib manual for how to use these macros.
Packit 33f14e
Packit 33f14e
   Suppress extern inline with HP-UX cc, as it appears to be broken; see
Packit 33f14e
   <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
Packit 33f14e
Packit 33f14e
   Suppress extern inline with Sun C in standards-conformance mode, as it
Packit 33f14e
   mishandles inline functions that call each other.  E.g., for 'inline void f
Packit 33f14e
   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
Packit 33f14e
   'reference to static identifier "f" in extern inline function'.
Packit 33f14e
   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
Packit 33f14e
Packit 33f14e
   Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
Packit 33f14e
   on configurations that mistakenly use 'static inline' to implement
Packit 33f14e
   functions or macros in standard C headers like <ctype.h>.  For example,
Packit 33f14e
   if isdigit is mistakenly implemented via a static inline function,
Packit 33f14e
   a program containing an extern inline function that calls isdigit
Packit 33f14e
   may not work since the C standard prohibits extern inline functions
Packit 33f14e
   from calling static functions.  This bug is known to occur on:
Packit 33f14e
Packit 33f14e
     OS X 10.8 and earlier; see:
Packit 33f14e
     http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
Packit 33f14e
Packit 33f14e
     DragonFly; see
Packit 33f14e
     http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
Packit 33f14e
Packit 33f14e
     FreeBSD; see:
Packit 33f14e
     http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
Packit 33f14e
Packit 33f14e
   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
Packit 33f14e
   for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
Packit 33f14e
   Assume DragonFly and FreeBSD will be similar.  */
Packit 33f14e
#if (((defined __APPLE__ && defined __MACH__) \
Packit 33f14e
      || defined __DragonFly__ || defined __FreeBSD__) \
Packit 33f14e
     && (defined __header_inline \
Packit 33f14e
         ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
Packit 33f14e
            && ! defined __clang__) \
Packit 33f14e
         : ((! defined _DONT_USE_CTYPE_INLINE_ \
Packit 33f14e
             && (defined __GNUC__ || defined __cplusplus)) \
Packit 33f14e
            || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
Packit 33f14e
                && defined __GNUC__ && ! defined __cplusplus))))
Packit 33f14e
# define _GL_EXTERN_INLINE_STDHEADER_BUG
Packit 33f14e
#endif
Packit 33f14e
#if ((__GNUC__ \
Packit 33f14e
      ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
Packit 33f14e
      : (199901L <= __STDC_VERSION__ \
Packit 33f14e
         && !defined __HP_cc \
Packit 33f14e
         && !defined __PGI \
Packit 33f14e
         && !(defined __SUNPRO_C && __STDC__))) \
Packit 33f14e
     && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
Packit 33f14e
# define _GL_INLINE inline
Packit 33f14e
# define _GL_EXTERN_INLINE extern inline
Packit 33f14e
# define _GL_EXTERN_INLINE_IN_USE
Packit 33f14e
#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
Packit 33f14e
       && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
Packit 33f14e
# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
Packit 33f14e
   /* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
Packit 33f14e
#  define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
Packit 33f14e
# else
Packit 33f14e
#  define _GL_INLINE extern inline
Packit 33f14e
# endif
Packit 33f14e
# define _GL_EXTERN_INLINE extern
Packit 33f14e
# define _GL_EXTERN_INLINE_IN_USE
Packit 33f14e
#else
Packit 33f14e
# define _GL_INLINE static _GL_UNUSED
Packit 33f14e
# define _GL_EXTERN_INLINE static _GL_UNUSED
Packit 33f14e
#endif
Packit 33f14e
Packit 33f14e
/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
Packit 33f14e
   suppress bogus "no previous prototype for 'FOO'"
Packit 33f14e
   and "no previous declaration for 'FOO'" diagnostics,
Packit 33f14e
   when FOO is an inline function in the header; see
Packit 33f14e
   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
Packit 33f14e
   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>.  */
Packit 33f14e
#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
Packit 33f14e
# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
Packit 33f14e
#  define _GL_INLINE_HEADER_CONST_PRAGMA
Packit 33f14e
# else
Packit 33f14e
#  define _GL_INLINE_HEADER_CONST_PRAGMA \
Packit 33f14e
     _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
Packit 33f14e
# endif
Packit 33f14e
# define _GL_INLINE_HEADER_BEGIN \
Packit 33f14e
    _Pragma ("GCC diagnostic push") \
Packit 33f14e
    _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
Packit 33f14e
    _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
Packit 33f14e
    _GL_INLINE_HEADER_CONST_PRAGMA
Packit 33f14e
# define _GL_INLINE_HEADER_END \
Packit 33f14e
    _Pragma ("GCC diagnostic pop")
Packit 33f14e
#else
Packit 33f14e
# define _GL_INLINE_HEADER_BEGIN
Packit 33f14e
# define _GL_INLINE_HEADER_END
Packit 33f14e
#endif])
Packit 33f14e
])