Blame m4/extern-inline.m4

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