Add OVERRIDE and virtual where appropriate
[WebKit-https.git] / Source / WTF / wtf / Compiler.h
1 /*
2  * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef WTF_Compiler_h
27 #define WTF_Compiler_h
28
29 /* COMPILER() - the compiler being used to build the project */
30 #define COMPILER(WTF_FEATURE) (defined WTF_COMPILER_##WTF_FEATURE  && WTF_COMPILER_##WTF_FEATURE)
31
32 /* COMPILER_SUPPORTS() - whether the compiler being used to build the project supports the given feature. */
33 #define COMPILER_SUPPORTS(WTF_COMPILER_FEATURE) (defined WTF_COMPILER_SUPPORTS_##WTF_COMPILER_FEATURE  && WTF_COMPILER_SUPPORTS_##WTF_COMPILER_FEATURE)
34
35 /* COMPILER_QUIRK() - whether the compiler being used to build the project requires a given quirk. */
36 #define COMPILER_QUIRK(WTF_COMPILER_QUIRK) (defined WTF_COMPILER_QUIRK_##WTF_COMPILER_QUIRK  && WTF_COMPILER_QUIRK_##WTF_COMPILER_QUIRK)
37
38 /* ==== COMPILER() - the compiler being used to build the project ==== */
39
40 /* COMPILER(CLANG) - Clang  */
41 #if defined(__clang__)
42 #define WTF_COMPILER_CLANG 1
43
44 /* Specific compiler features */
45 #define WTF_COMPILER_SUPPORTS_CXX_VARIADIC_TEMPLATES __has_feature(cxx_variadic_templates)
46 #define WTF_COMPILER_SUPPORTS_CXX_RVALUE_REFERENCES __has_feature(cxx_rvalue_references)
47 #define WTF_COMPILER_SUPPORTS_CXX_DELETED_FUNCTIONS __has_feature(cxx_deleted_functions)
48 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR __has_feature(cxx_nullptr)
49 #define WTF_COMPILER_SUPPORTS_CXX_EXPLICIT_CONVERSIONS __has_feature(cxx_explicit_conversions)
50 #define WTF_COMPILER_SUPPORTS_BLOCKS __has_feature(blocks)
51 #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT __has_feature(c_static_assert)
52 #define WTF_COMPILER_SUPPORTS_CXX_STATIC_ASSERT __has_feature(cxx_static_assert)
53 #define WTF_COMPILER_SUPPORTS_CXX_OVERRIDE_CONTROL __has_feature(cxx_override_control)
54 #define WTF_COMPILER_SUPPORTS_CXX_STRONG_ENUMS __has_feature(cxx_strong_enums)
55 #define WTF_COMPILER_SUPPORTS_CXX_REFERENCE_QUALIFIED_FUNCTIONS __has_feature(cxx_reference_qualified_functions)
56 #define WTF_COMPILER_SUPPORTS_CXX_AUTO_TYPE __has_feature(cxx_auto_type)
57
58 /* Disable final on versions of Apple clang earlier than 4.2 to avoid bugs like http://webkit.org/b/119165 */
59 #if defined(__APPLE__) && (__clang_major__ < 4 || (__clang_major__ == 4 && __clang_minor__ < 2))
60 #define WTF_COMPILER_QUIRK_FINAL_IS_BUGGY 1
61 // #error "Please use a newer version of Xcode, this version has code generation bugs when using 'final' in C++ code"
62 #endif
63
64 #endif
65
66 /* COMPILER(MSVC) - Microsoft Visual C++ */
67 /* COMPILER(MSVC9_OR_LOWER) - Microsoft Visual C++ 2008 or lower*/
68 #if defined(_MSC_VER)
69 #define WTF_COMPILER_MSVC 1
70 #if _MSC_VER < 1600
71 #define WTF_COMPILER_MSVC9_OR_LOWER 1
72 #endif
73
74 /* Specific compiler features */
75 #if !COMPILER(CLANG) && _MSC_VER >= 1600
76 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR 1
77 #endif
78
79 #if !COMPILER(CLANG)
80 #define WTF_COMPILER_SUPPORTS_CXX_OVERRIDE_CONTROL 1
81 #define WTF_COMPILER_QUIRK_FINAL_IS_CALLED_SEALED 1
82 #endif
83
84 /* Check for VS2010 or newer */
85 #if _MSC_VER >= 1600
86 #define WTF_COMPILER_SUPPORTS_CXX_RVALUE_REFERENCES 1
87 #define WTF_COMPILER_SUPPORTS_CXX_STATIC_ASSERT 1
88 #define WTF_COMPILER_SUPPORTS_CXX_AUTO_TYPE 1
89 #endif
90
91 #endif /* defined(_MSC_VER) */
92
93 /* COMPILER(RVCT) - ARM RealView Compilation Tools */
94 #if defined(__CC_ARM) || defined(__ARMCC__)
95 #define WTF_COMPILER_RVCT 1
96 #define RVCT_VERSION_AT_LEAST(major, minor, patch, build) (__ARMCC_VERSION >= (major * 100000 + minor * 10000 + patch * 1000 + build))
97 #else
98 /* Define this for !RVCT compilers, just so we can write things like RVCT_VERSION_AT_LEAST(3, 0, 0, 0). */
99 #define RVCT_VERSION_AT_LEAST(major, minor, patch, build) 0
100 #endif
101
102 /* COMPILER(GCCE) - GNU Compiler Collection for Embedded */
103 #if defined(__GCCE__)
104 #define WTF_COMPILER_GCCE 1
105 #define GCCE_VERSION (__GCCE__ * 10000 + __GCCE_MINOR__ * 100 + __GCCE_PATCHLEVEL__)
106 #define GCCE_VERSION_AT_LEAST(major, minor, patch) (GCCE_VERSION >= (major * 10000 + minor * 100 + patch))
107 #endif
108
109 /* COMPILER(GCC) - GNU Compiler Collection */
110 /* --gnu option of the RVCT compiler also defines __GNUC__ */
111 #if defined(__GNUC__) && !COMPILER(RVCT)
112 #define WTF_COMPILER_GCC 1
113 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
114 #define GCC_VERSION_AT_LEAST(major, minor, patch) (GCC_VERSION >= (major * 10000 + minor * 100 + patch))
115 #else
116 /* Define this for !GCC compilers, just so we can write things like GCC_VERSION_AT_LEAST(4, 1, 0). */
117 #define GCC_VERSION_AT_LEAST(major, minor, patch) 0
118 #endif
119
120 /* Specific compiler features */
121 #if COMPILER(GCC) && !COMPILER(CLANG)
122 #if GCC_VERSION_AT_LEAST(4, 8, 0)
123 #pragma GCC diagnostic ignored "-Wunused-local-typedefs"
124 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
125 #endif
126 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
127 /* C11 support */
128 #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT 1
129 #endif
130 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && __cplusplus >= 201103L)
131 /* C++11 support */
132 #if GCC_VERSION_AT_LEAST(4, 3, 0)
133 #define WTF_COMPILER_SUPPORTS_CXX_RVALUE_REFERENCES 1
134 #define WTF_COMPILER_SUPPORTS_CXX_STATIC_ASSERT 1
135 #define WTF_COMPILER_SUPPORTS_CXX_VARIADIC_TEMPLATES 1
136 #define WTF_COMPILER_SUPPORTS_CXX_AUTO_TYPE 1
137 #endif
138 #if GCC_VERSION_AT_LEAST(4, 4, 0)
139 #define WTF_COMPILER_SUPPORTS_CXX_DELETED_FUNCTIONS 1
140 #endif
141 #if GCC_VERSION_AT_LEAST(4, 5, 0)
142 #define WTF_COMPILER_SUPPORTS_CXX_EXPLICIT_CONVERSIONS 1
143 #endif
144 #if GCC_VERSION_AT_LEAST(4, 6, 0)
145 #define WTF_COMPILER_SUPPORTS_CXX_NULLPTR 1
146 /* Strong enums should work from gcc 4.4, but doesn't seem to support some operators */
147 #define WTF_COMPILER_SUPPORTS_CXX_STRONG_ENUMS 1
148 #endif
149 #if GCC_VERSION_AT_LEAST(4, 7, 0)
150 #define WTF_COMPILER_SUPPORTS_CXX_OVERRIDE_CONTROL 1
151 #endif
152 #endif /* defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(__cplusplus) && __cplusplus >= 201103L) */
153 #endif /* COMPILER(GCC) */
154
155 /* COMPILER(MINGW) - MinGW GCC */
156 /* COMPILER(MINGW64) - mingw-w64 GCC - only used as additional check to exclude mingw.org specific functions */
157 #if defined(__MINGW32__)
158 #define WTF_COMPILER_MINGW 1
159 #include <_mingw.h> /* private MinGW header */
160     #if defined(__MINGW64_VERSION_MAJOR) /* best way to check for mingw-w64 vs mingw.org */
161         #define WTF_COMPILER_MINGW64 1
162     #endif /* __MINGW64_VERSION_MAJOR */
163 #endif /* __MINGW32__ */
164
165 /* COMPILER(INTEL) - Intel C++ Compiler */
166 #if defined(__INTEL_COMPILER)
167 #define WTF_COMPILER_INTEL 1
168 #endif
169
170 /* COMPILER(SUNCC) */
171 #if defined(__SUNPRO_CC) || defined(__SUNPRO_C)
172 #define WTF_COMPILER_SUNCC 1
173 #endif
174
175 /* ABI */
176 #if defined(__ARM_EABI__) || defined(__EABI__)
177 #define WTF_COMPILER_SUPPORTS_EABI 1
178 #endif
179
180 /* ==== Compiler features ==== */
181
182 /* Required C++11 features. We can remove these once they've been required for some time */
183
184 #ifdef __cplusplus
185 #if !COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES)
186 #error "Please use a compiler that supports C++11 rvalue references."
187 #endif
188 #if !COMPILER_SUPPORTS(CXX_STATIC_ASSERT)
189 #error "Please use a compiler that supports C++11 static_assert."
190 #endif
191 #if !COMPILER_SUPPORTS(CXX_AUTO_TYPE)
192 #error "Please use a compiler that supports C++11 auto."
193 #endif
194 #endif
195
196 /* PURE_FUNCTION */
197
198 #if COMPILER(GCC)
199 #define PURE_FUNCTION __attribute__ ((__pure__))
200 #else
201 #define PURE_FUNCTION
202 #endif
203
204 /* ALWAYS_INLINE */
205
206 #ifndef ALWAYS_INLINE
207 #if COMPILER(GCC) && defined(NDEBUG) && !COMPILER(MINGW)
208 #define ALWAYS_INLINE inline __attribute__((__always_inline__))
209 #elif (COMPILER(MSVC) || COMPILER(RVCT)) && defined(NDEBUG)
210 #define ALWAYS_INLINE __forceinline
211 #else
212 #define ALWAYS_INLINE inline
213 #endif
214 #endif
215
216
217 /* NEVER_INLINE */
218
219 #ifndef NEVER_INLINE
220 #if COMPILER(GCC)
221 #define NEVER_INLINE __attribute__((__noinline__))
222 #elif COMPILER(RVCT)
223 #define NEVER_INLINE __declspec(noinline)
224 #else
225 #define NEVER_INLINE
226 #endif
227 #endif
228
229
230 /* UNLIKELY */
231
232 #ifndef UNLIKELY
233 #if COMPILER(GCC) || (COMPILER(RVCT) && defined(__GNUC__))
234 #define UNLIKELY(x) __builtin_expect(!!(x), 0)
235 #else
236 #define UNLIKELY(x) (x)
237 #endif
238 #endif
239
240
241 /* LIKELY */
242
243 #ifndef LIKELY
244 #if COMPILER(GCC) || (COMPILER(RVCT) && defined(__GNUC__))
245 #define LIKELY(x) __builtin_expect(!!(x), 1)
246 #else
247 #define LIKELY(x) (x)
248 #endif
249 #endif
250
251
252 /* NO_RETURN */
253
254
255 #ifndef NO_RETURN
256 #if COMPILER(GCC)
257 #define NO_RETURN __attribute((__noreturn__))
258 #elif COMPILER(MSVC) || COMPILER(RVCT)
259 #define NO_RETURN __declspec(noreturn)
260 #else
261 #define NO_RETURN
262 #endif
263 #endif
264
265
266 /* NO_RETURN_WITH_VALUE */
267
268 #ifndef NO_RETURN_WITH_VALUE
269 #if !COMPILER(MSVC)
270 #define NO_RETURN_WITH_VALUE NO_RETURN
271 #else
272 #define NO_RETURN_WITH_VALUE
273 #endif
274 #endif
275
276
277 /* WARN_UNUSED_RETURN */
278
279 #if COMPILER(GCC)
280 #define WARN_UNUSED_RETURN __attribute__ ((warn_unused_result))
281 #else
282 #define WARN_UNUSED_RETURN
283 #endif
284
285 /* OVERRIDE and FINAL */
286
287 #if COMPILER_SUPPORTS(CXX_OVERRIDE_CONTROL)
288 #define OVERRIDE override
289 #else
290 #define OVERRIDE
291 #endif
292
293 #if COMPILER_SUPPORTS(CXX_OVERRIDE_CONTROL) && !COMPILER_QUIRK(FINAL_IS_BUGGY)
294 #if COMPILER_QUIRK(FINAL_IS_CALLED_SEALED)
295 #define FINAL sealed
296 #define final sealed
297 #else
298 #define FINAL final
299 #endif
300 #else
301 #define FINAL
302 #endif
303
304 #if COMPILER_SUPPORTS(CXX_DELETED_FUNCTIONS)
305 #define WTF_DELETED_FUNCTION = delete
306 #else
307 #define WTF_DELETED_FUNCTION
308 #endif
309
310 /* REFERENCED_FROM_ASM */
311
312 #ifndef REFERENCED_FROM_ASM
313 #if COMPILER(GCC)
314 #define REFERENCED_FROM_ASM __attribute__((used))
315 #else
316 #define REFERENCED_FROM_ASM
317 #endif
318 #endif
319
320 /* OBJC_CLASS */
321
322 #ifndef OBJC_CLASS
323 #ifdef __OBJC__
324 #define OBJC_CLASS @class
325 #else
326 #define OBJC_CLASS class
327 #endif
328 #endif
329
330 /* UNUSED_PARAM */
331
332 #if COMPILER(INTEL) && !(defined(WIN32) || defined(_WIN32)) || COMPILER(RVCT)
333 template<typename T>
334 inline void unusedParam(T& x) { (void)x; }
335 #define UNUSED_PARAM(variable) unusedParam(variable)
336 #elif COMPILER(MSVC)
337 #define UNUSED_PARAM(variable) (void)&variable
338 #else
339 #define UNUSED_PARAM(variable) (void)variable
340 #endif
341
342 /* UNUSED_LABEL */
343
344 /* This is to keep the compiler from complaining when for local labels are
345  declared but not referenced. For example, this can happen with code that
346  works with auto-generated code.
347  */
348 #if COMPILER(MSVC)
349 #define UNUSED_LABEL(label) if (false) goto label
350 #else
351 #define UNUSED_LABEL(label) UNUSED_PARAM(&& label)
352 #endif
353
354
355
356 #endif /* WTF_Compiler_h */