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