-Wunused-variable in RenderLayer::updateScrollableAreaSet
[WebKit-https.git] / Source / WTF / wtf / Compiler.h
1 /*
2  * Copyright (C) 2011, 2012, 2014 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_HAS_CLANG_BUILTIN() - whether the compiler supports a particular clang builtin. */
39 #ifdef __has_builtin
40 #define COMPILER_HAS_CLANG_BUILTIN(x) __has_builtin(x)
41 #else
42 #define COMPILER_HAS_CLANG_BUILTIN(x) 0
43 #endif
44
45 /* COMPILER_HAS_CLANG_FEATURE() - whether the compiler supports a particular language or library feature. */
46 /* http://clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension */
47 #ifdef __has_feature
48 #define COMPILER_HAS_CLANG_FEATURE(x) __has_feature(x)
49 #else
50 #define COMPILER_HAS_CLANG_FEATURE(x) 0
51 #endif
52
53 /* COMPILER_HAS_CLANG_DECLSPEC() - whether the compiler supports a Microsoft style __declspec attribute. */
54 /* https://clang.llvm.org/docs/LanguageExtensions.html#has-declspec-attribute */
55 #ifdef __has_declspec_attribute
56 #define COMPILER_HAS_CLANG_DECLSPEC(x) __has_declspec_attribute(x)
57 #else
58 #define COMPILER_HAS_CLANG_DECLSPEC(x) 0
59 #endif
60
61 /* ==== COMPILER() - primary detection of the compiler being used to build the project, in alphabetical order ==== */
62
63 /* COMPILER(CLANG) - Clang  */
64
65 #if defined(__clang__)
66 #define WTF_COMPILER_CLANG 1
67 #define WTF_COMPILER_SUPPORTS_BLOCKS COMPILER_HAS_CLANG_FEATURE(blocks)
68 #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT COMPILER_HAS_CLANG_FEATURE(c_static_assert)
69 #define WTF_COMPILER_SUPPORTS_CXX_EXCEPTIONS COMPILER_HAS_CLANG_FEATURE(cxx_exceptions)
70 #define WTF_COMPILER_SUPPORTS_BUILTIN_IS_TRIVIALLY_COPYABLE COMPILER_HAS_CLANG_FEATURE(is_trivially_copyable)
71
72 #ifdef __cplusplus
73 #if __cplusplus <= 201103L
74 #define WTF_CPP_STD_VER 11
75 #elif __cplusplus <= 201402L
76 #define WTF_CPP_STD_VER 14
77 #elif __cplusplus <= 201703L
78 #define WTF_CPP_STD_VER 17
79 #endif
80 #endif
81
82 #endif // defined(__clang__)
83
84 /* COMPILER(GCC_COMPATIBLE) - GNU Compiler Collection or compatibles */
85 #if defined(__GNUC__)
86 #define WTF_COMPILER_GCC_COMPATIBLE 1
87 #endif
88
89 /* COMPILER(GCC) - GNU Compiler Collection */
90 /* Note: This section must come after the Clang section since we check !COMPILER(CLANG) here. */
91 #if COMPILER(GCC_COMPATIBLE) && !COMPILER(CLANG)
92 #define WTF_COMPILER_GCC 1
93
94 #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
95 #define GCC_VERSION_AT_LEAST(major, minor, patch) (GCC_VERSION >= (major * 10000 + minor * 100 + patch))
96
97 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
98 #define WTF_COMPILER_SUPPORTS_C_STATIC_ASSERT 1
99 #endif
100
101 #endif /* COMPILER(GCC) */
102
103 #if COMPILER(GCC_COMPATIBLE) && defined(NDEBUG) && !defined(__OPTIMIZE__) && !defined(RELEASE_WITHOUT_OPTIMIZATIONS)
104 #error "Building release without compiler optimizations: WebKit will be slow. Set -DRELEASE_WITHOUT_OPTIMIZATIONS if this is intended."
105 #endif
106
107 /* COMPILER(MINGW) - MinGW GCC */
108
109 #if defined(__MINGW32__)
110 #define WTF_COMPILER_MINGW 1
111 #include <_mingw.h>
112 #endif
113
114 /* COMPILER(MINGW64) - mingw-w64 GCC - used as additional check to exclude mingw.org specific functions */
115
116 /* Note: This section must come after the MinGW section since we check COMPILER(MINGW) here. */
117
118 #if COMPILER(MINGW) && defined(__MINGW64_VERSION_MAJOR) /* best way to check for mingw-w64 vs mingw.org */
119 #define WTF_COMPILER_MINGW64 1
120 #endif
121
122 /* COMPILER(MSVC) - Microsoft Visual C++ */
123
124 #if defined(_MSC_VER)
125
126 #define WTF_COMPILER_MSVC 1
127
128 #if _MSC_VER < 1910
129 #error "Please use a newer version of Visual Studio. WebKit requires VS2017 or newer to compile."
130 #endif
131
132 #endif
133
134 #if !COMPILER(CLANG) && !COMPILER(MSVC)
135 #define WTF_COMPILER_QUIRK_CONSIDERS_UNREACHABLE_CODE 1
136 #endif
137
138 /* ==== COMPILER_SUPPORTS - additional compiler feature detection, in alphabetical order ==== */
139
140 /* COMPILER_SUPPORTS(EABI) */
141
142 #if defined(__ARM_EABI__) || defined(__EABI__)
143 #define WTF_COMPILER_SUPPORTS_EABI 1
144 #endif
145
146 /* ASAN_ENABLED and SUPPRESS_ASAN */
147
148 #ifdef __SANITIZE_ADDRESS__
149 #define ASAN_ENABLED 1
150 #else
151 #define ASAN_ENABLED COMPILER_HAS_CLANG_FEATURE(address_sanitizer)
152 #endif
153
154 #if ASAN_ENABLED
155 #define SUPPRESS_ASAN __attribute__((no_sanitize_address))
156 #else
157 #define SUPPRESS_ASAN
158 #endif
159
160 /* ==== Compiler-independent macros for various compiler features, in alphabetical order ==== */
161
162 /* ALWAYS_INLINE */
163
164 /* In GCC functions marked with no_sanitize_address cannot call functions that are marked with always_inline and not marked with no_sanitize_address.
165  * Therefore we need to give up on the enforcement of ALWAYS_INLINE when bulding with ASAN. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 */
166 #if !defined(ALWAYS_INLINE) && COMPILER(GCC_COMPATIBLE) && defined(NDEBUG) && !COMPILER(MINGW) && !(COMPILER(GCC) && ASAN_ENABLED)
167 #define ALWAYS_INLINE inline __attribute__((__always_inline__))
168 #endif
169
170 #if !defined(ALWAYS_INLINE) && COMPILER(MSVC) && defined(NDEBUG)
171 #define ALWAYS_INLINE __forceinline
172 #endif
173
174 #if !defined(ALWAYS_INLINE)
175 #define ALWAYS_INLINE inline
176 #endif
177
178 #if COMPILER(MSVC)
179 #define ALWAYS_INLINE_EXCEPT_MSVC inline
180 #else
181 #define ALWAYS_INLINE_EXCEPT_MSVC ALWAYS_INLINE
182 #endif
183
184 /* WTF_EXTERN_C_{BEGIN, END} */
185
186 #ifdef __cplusplus
187 #define WTF_EXTERN_C_BEGIN extern "C" {
188 #define WTF_EXTERN_C_END }
189 #else
190 #define WTF_EXTERN_C_BEGIN
191 #define WTF_EXTERN_C_END
192 #endif
193
194 /* FALLTHROUGH */
195
196 #if !defined(FALLTHROUGH) && defined(__cplusplus) && defined(__has_cpp_attribute)
197
198 #if __has_cpp_attribute(fallthrough)
199 #define FALLTHROUGH [[fallthrough]]
200 #elif __has_cpp_attribute(clang::fallthrough)
201 #define FALLTHROUGH [[clang::fallthrough]]
202 #elif __has_cpp_attribute(gnu::fallthrough)
203 #define FALLTHROUGH [[gnu::fallthrough]]
204 #endif
205
206 #elif !defined(FALLTHROUGH) && !defined(__cplusplus)
207
208 #if COMPILER(GCC)
209 #if GCC_VERSION_AT_LEAST(7, 0, 0)
210 #define FALLTHROUGH __attribute__ ((fallthrough))
211 #endif
212 #endif
213
214 #endif // !defined(FALLTHROUGH) && defined(__cplusplus) && defined(__has_cpp_attribute)
215
216 #if !defined(FALLTHROUGH)
217 #define FALLTHROUGH
218 #endif
219
220 /* LIKELY */
221
222 #if !defined(LIKELY) && COMPILER(GCC_COMPATIBLE)
223 #define LIKELY(x) __builtin_expect(!!(x), 1)
224 #endif
225
226 #if !defined(LIKELY)
227 #define LIKELY(x) (x)
228 #endif
229
230 /* NEVER_INLINE */
231
232 #if !defined(NEVER_INLINE) && COMPILER(GCC_COMPATIBLE)
233 #define NEVER_INLINE __attribute__((__noinline__))
234 #endif
235
236 #if !defined(NEVER_INLINE) && COMPILER(MSVC)
237 #define NEVER_INLINE __declspec(noinline)
238 #endif
239
240 #if !defined(NEVER_INLINE)
241 #define NEVER_INLINE
242 #endif
243
244 /* NO_RETURN */
245
246 #if !defined(NO_RETURN) && COMPILER(GCC_COMPATIBLE)
247 #define NO_RETURN __attribute((__noreturn__))
248 #endif
249
250 #if !defined(NO_RETURN) && COMPILER(MSVC)
251 #define NO_RETURN __declspec(noreturn)
252 #endif
253
254 #if !defined(NO_RETURN)
255 #define NO_RETURN
256 #endif
257
258 /* NOT_TAIL_CALLED */
259
260 #if !defined(NOT_TAIL_CALLED) && defined(__has_attribute)
261 #if __has_attribute(not_tail_called)
262 #define NOT_TAIL_CALLED __attribute__((not_tail_called))
263 #endif
264 #endif
265
266 #if !defined(NOT_TAIL_CALLED)
267 #define NOT_TAIL_CALLED
268 #endif
269
270 /* RETURNS_NONNULL */
271 #if !defined(RETURNS_NONNULL) && COMPILER(GCC_COMPATIBLE)
272 #define RETURNS_NONNULL __attribute__((returns_nonnull))
273 #endif
274
275 #if !defined(RETURNS_NONNULL)
276 #define RETURNS_NONNULL
277 #endif
278
279 /* NO_RETURN_WITH_VALUE */
280
281 #if !defined(NO_RETURN_WITH_VALUE) && !COMPILER(MSVC)
282 #define NO_RETURN_WITH_VALUE NO_RETURN
283 #endif
284
285 #if !defined(NO_RETURN_WITH_VALUE)
286 #define NO_RETURN_WITH_VALUE
287 #endif
288
289 /* OBJC_CLASS */
290
291 #if !defined(OBJC_CLASS) && defined(__OBJC__)
292 #define OBJC_CLASS @class
293 #endif
294
295 #if !defined(OBJC_CLASS)
296 #define OBJC_CLASS class
297 #endif
298
299 /* OBJC_PROTOCOL */
300
301 #if !defined(OBJC_PROTOCOL) && defined(__OBJC__)
302 /* This forward-declares a protocol, then also creates a type of the same name based on NSObject.
303  * This allows us to use "NSObject<MyProtocol> *" or "MyProtocol *" more-or-less interchangably. */
304 #define OBJC_PROTOCOL(protocolName) @protocol protocolName; using protocolName = NSObject<protocolName>
305 #endif
306
307 #if !defined(OBJC_PROTOCOL)
308 #define OBJC_PROTOCOL(protocolName) class protocolName
309 #endif
310
311 /* PURE_FUNCTION */
312
313 #if !defined(PURE_FUNCTION) && COMPILER(GCC_COMPATIBLE)
314 #define PURE_FUNCTION __attribute__((__pure__))
315 #endif
316
317 #if !defined(PURE_FUNCTION)
318 #define PURE_FUNCTION
319 #endif
320
321 /* UNUSED_FUNCTION */
322
323 #if !defined(UNUSED_FUNCTION) && COMPILER(GCC_COMPATIBLE)
324 #define UNUSED_FUNCTION __attribute__((unused))
325 #endif
326
327 #if !defined(UNUSED_FUNCTION)
328 #define UNUSED_FUNCTION
329 #endif
330
331 /* REFERENCED_FROM_ASM */
332
333 #if !defined(REFERENCED_FROM_ASM) && COMPILER(GCC_COMPATIBLE)
334 #define REFERENCED_FROM_ASM __attribute__((__used__))
335 #endif
336
337 #if !defined(REFERENCED_FROM_ASM)
338 #define REFERENCED_FROM_ASM
339 #endif
340
341 /* UNLIKELY */
342
343 #if !defined(UNLIKELY) && COMPILER(GCC_COMPATIBLE)
344 #define UNLIKELY(x) __builtin_expect(!!(x), 0)
345 #endif
346
347 #if !defined(UNLIKELY)
348 #define UNLIKELY(x) (x)
349 #endif
350
351 /* UNUSED_LABEL */
352
353 /* Keep the compiler from complaining for a local label that is defined but not referenced. */
354 /* Helpful when mixing hand-written and autogenerated code. */
355
356 #if !defined(UNUSED_LABEL) && COMPILER(MSVC)
357 #define UNUSED_LABEL(label) if (false) goto label
358 #endif
359
360 #if !defined(UNUSED_LABEL)
361 #define UNUSED_LABEL(label) UNUSED_PARAM(&& label)
362 #endif
363
364 /* UNUSED_PARAM */
365
366 #if !defined(UNUSED_PARAM)
367 #define UNUSED_PARAM(variable) (void)variable
368 #endif
369
370 /* UNUSED_VARIABLE */
371 #if !defined(UNUSED_VARIABLE)
372 #define UNUSED_VARIABLE(variable) UNUSED_PARAM(variable)
373 #endif
374
375 /* WARN_UNUSED_RETURN */
376
377 #if !defined(WARN_UNUSED_RETURN) && COMPILER(GCC_COMPATIBLE)
378 #define WARN_UNUSED_RETURN __attribute__((__warn_unused_result__))
379 #endif
380
381 #if !defined(WARN_UNUSED_RETURN)
382 #define WARN_UNUSED_RETURN
383 #endif
384
385 #if !defined(__has_include) && COMPILER(MSVC)
386 #define __has_include(path) 0
387 #endif
388
389 /* IGNORE_WARNINGS */
390
391 /* Can't use WTF_CONCAT() and STRINGIZE() because they are defined in
392  * StdLibExtras.h, which includes this file. */
393 #define _COMPILER_CONCAT_I(a, b) a ## b
394 #define _COMPILER_CONCAT(a, b) _COMPILER_CONCAT_I(a, b)
395
396 #define _COMPILER_STRINGIZE(exp) #exp
397
398 #define _COMPILER_WARNING_NAME(warning) "-W" warning
399
400 #if COMPILER(GCC) || COMPILER(CLANG)
401 #define IGNORE_WARNINGS_BEGIN_COND(cond, compiler, warning) \
402     _Pragma(_COMPILER_STRINGIZE(compiler diagnostic push)) \
403     _COMPILER_CONCAT(IGNORE_WARNINGS_BEGIN_IMPL_, cond)(compiler, warning)
404
405 #define IGNORE_WARNINGS_BEGIN_IMPL_1(compiler, warning) \
406     _Pragma(_COMPILER_STRINGIZE(compiler diagnostic ignored warning))
407 #define IGNORE_WARNINGS_BEGIN_IMPL_0(compiler, warning)
408 #define IGNORE_WARNINGS_BEGIN_IMPL_(compiler, warning)
409
410
411 #define IGNORE_WARNINGS_END_IMPL(compiler) _Pragma(_COMPILER_STRINGIZE(compiler diagnostic pop))
412
413 #if defined(__has_warning)
414 #define _IGNORE_WARNINGS_BEGIN_IMPL(compiler, warning) \
415     IGNORE_WARNINGS_BEGIN_COND(__has_warning(warning), compiler, warning)
416 #else
417 #define _IGNORE_WARNINGS_BEGIN_IMPL(compiler, warning) IGNORE_WARNINGS_BEGIN_COND(1, compiler, warning)
418 #endif
419
420 #define IGNORE_WARNINGS_BEGIN_IMPL(compiler, warning) \
421     _IGNORE_WARNINGS_BEGIN_IMPL(compiler, _COMPILER_WARNING_NAME(warning))
422
423 #endif // COMPILER(GCC) || COMPILER(CLANG)
424
425
426 #if COMPILER(GCC)
427 #define IGNORE_GCC_WARNINGS_BEGIN(warning) IGNORE_WARNINGS_BEGIN_IMPL(GCC, warning)
428 #define IGNORE_GCC_WARNINGS_END IGNORE_WARNINGS_END_IMPL(GCC)
429 #else
430 #define IGNORE_GCC_WARNINGS_BEGIN(warning)
431 #define IGNORE_GCC_WARNINGS_END
432 #endif
433
434 #if COMPILER(CLANG)
435 #define IGNORE_CLANG_WARNINGS_BEGIN(warning) IGNORE_WARNINGS_BEGIN_IMPL(clang, warning)
436 #define IGNORE_CLANG_WARNINGS_END IGNORE_WARNINGS_END_IMPL(clang)
437 #else
438 #define IGNORE_CLANG_WARNINGS_BEGIN(warning)
439 #define IGNORE_CLANG_WARNINGS_END
440 #endif
441
442 #if COMPILER(GCC) || COMPILER(CLANG)
443 #define IGNORE_WARNINGS_BEGIN(warning) IGNORE_WARNINGS_BEGIN_IMPL(GCC, warning)
444 #define IGNORE_WARNINGS_END IGNORE_WARNINGS_END_IMPL(GCC)
445 #else
446 #define IGNORE_WARNINGS_BEGIN(warning)
447 #define IGNORE_WARNINGS_END
448 #endif
449
450 #define ALLOW_DEPRECATED_DECLARATIONS_BEGIN IGNORE_WARNINGS_BEGIN("deprecated-declarations")
451 #define ALLOW_DEPRECATED_DECLARATIONS_END IGNORE_WARNINGS_END
452
453 #define ALLOW_NEW_API_WITHOUT_GUARDS_BEGIN IGNORE_CLANG_WARNINGS_BEGIN("unguarded-availability-new")
454 #define ALLOW_NEW_API_WITHOUT_GUARDS_END IGNORE_CLANG_WARNINGS_END
455
456 #define ALLOW_UNUSED_PARAMETERS_BEGIN IGNORE_WARNINGS_BEGIN("unused-parameter")
457 #define ALLOW_UNUSED_PARAMETERS_END IGNORE_WARNINGS_END
458
459 #define ALLOW_NONLITERAL_FORMAT_BEGIN IGNORE_WARNINGS_BEGIN("format-nonliteral")
460 #define ALLOW_NONLITERAL_FORMAT_END IGNORE_WARNINGS_END
461
462 #define IGNORE_RETURN_TYPE_WARNINGS_BEGIN IGNORE_WARNINGS_BEGIN("return-type")
463 #define IGNORE_RETURN_TYPE_WARNINGS_END IGNORE_WARNINGS_END
464
465 #define IGNORE_NULL_CHECK_WARNINGS_BEGIN IGNORE_WARNINGS_BEGIN("nonnull")
466 #define IGNORE_NULL_CHECK_WARNINGS_END IGNORE_WARNINGS_END
467
468 #endif /* WTF_Compiler_h */