extern-inline.m4 4.2 KB

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