1 | /**************************************************************************** |
2 | ** |
3 | ** Copyright (C) 2016 The Qt Company Ltd. |
4 | ** Copyright (C) 2016 Intel Corporation. |
5 | ** Contact: https://www.qt.io/licensing/ |
6 | ** |
7 | ** This file is part of the QtCore module of the Qt Toolkit. |
8 | ** |
9 | ** $QT_BEGIN_LICENSE:LGPL$ |
10 | ** Commercial License Usage |
11 | ** Licensees holding valid commercial Qt licenses may use this file in |
12 | ** accordance with the commercial license agreement provided with the |
13 | ** Software or, alternatively, in accordance with the terms contained in |
14 | ** a written agreement between you and The Qt Company. For licensing terms |
15 | ** and conditions see https://www.qt.io/terms-conditions. For further |
16 | ** information use the contact form at https://www.qt.io/contact-us. |
17 | ** |
18 | ** GNU Lesser General Public License Usage |
19 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
20 | ** General Public License version 3 as published by the Free Software |
21 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
22 | ** packaging of this file. Please review the following information to |
23 | ** ensure the GNU Lesser General Public License version 3 requirements |
24 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
25 | ** |
26 | ** GNU General Public License Usage |
27 | ** Alternatively, this file may be used under the terms of the GNU |
28 | ** General Public License version 2.0 or (at your option) the GNU General |
29 | ** Public license version 3 or any later version approved by the KDE Free |
30 | ** Qt Foundation. The licenses are as published by the Free Software |
31 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
32 | ** included in the packaging of this file. Please review the following |
33 | ** information to ensure the GNU General Public License requirements will |
34 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
35 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
36 | ** |
37 | ** $QT_END_LICENSE$ |
38 | ** |
39 | ****************************************************************************/ |
40 | |
41 | #ifndef QGLOBAL_H |
42 | # include <QtCore/qglobal.h> |
43 | #endif |
44 | |
45 | #ifndef QCOMPILERDETECTION_H |
46 | #define QCOMPILERDETECTION_H |
47 | |
48 | /* |
49 | The compiler, must be one of: (Q_CC_x) |
50 | |
51 | SYM - Digital Mars C/C++ (used to be Symantec C++) |
52 | MSVC - Microsoft Visual C/C++, Intel C++ for Windows |
53 | BOR - Borland/Turbo C++ |
54 | WAT - Watcom C++ |
55 | GNU - GNU C++ |
56 | COMEAU - Comeau C++ |
57 | EDG - Edison Design Group C++ |
58 | OC - CenterLine C++ |
59 | SUN - Forte Developer, or Sun Studio C++ |
60 | MIPS - MIPSpro C++ |
61 | DEC - DEC C++ |
62 | HPACC - HP aC++ |
63 | USLC - SCO OUDK and UDK |
64 | CDS - Reliant C++ |
65 | KAI - KAI C++ |
66 | INTEL - Intel C++ for Linux, Intel C++ for Windows |
67 | HIGHC - MetaWare High C/C++ |
68 | PGI - Portland Group C++ |
69 | GHS - Green Hills Optimizing C++ Compilers |
70 | RVCT - ARM Realview Compiler Suite |
71 | CLANG - C++ front-end for the LLVM compiler |
72 | |
73 | |
74 | Should be sorted most to least authoritative. |
75 | */ |
76 | |
77 | /* Symantec C++ is now Digital Mars */ |
78 | #if defined(__DMC__) || defined(__SC__) |
79 | # define Q_CC_SYM |
80 | /* "explicit" semantics implemented in 8.1e but keyword recognized since 7.5 */ |
81 | # if defined(__SC__) && __SC__ < 0x750 |
82 | # error "Compiler not supported" |
83 | # endif |
84 | |
85 | #elif defined(_MSC_VER) |
86 | # ifdef __clang__ |
87 | # define Q_CC_CLANG ((__clang_major__ * 100) + __clang_minor__) |
88 | # endif |
89 | # define Q_CC_MSVC (_MSC_VER) |
90 | # define Q_CC_MSVC_NET |
91 | # define Q_OUTOFLINE_TEMPLATE inline |
92 | # define Q_COMPILER_MANGLES_RETURN_TYPE |
93 | # define Q_FUNC_INFO __FUNCSIG__ |
94 | # define Q_ALIGNOF(type) __alignof(type) |
95 | # define Q_DECL_ALIGN(n) __declspec(align(n)) |
96 | # define Q_ASSUME_IMPL(expr) __assume(expr) |
97 | # define Q_UNREACHABLE_IMPL() __assume(0) |
98 | # define Q_NORETURN __declspec(noreturn) |
99 | # define Q_DECL_DEPRECATED __declspec(deprecated) |
100 | # ifndef Q_CC_CLANG |
101 | # define Q_DECL_DEPRECATED_X(text) __declspec(deprecated(text)) |
102 | # endif |
103 | # define Q_DECL_EXPORT __declspec(dllexport) |
104 | # define Q_DECL_IMPORT __declspec(dllimport) |
105 | # define QT_MAKE_UNCHECKED_ARRAY_ITERATOR(x) stdext::make_unchecked_array_iterator(x) // Since _MSC_VER >= 1800 |
106 | # define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) stdext::make_checked_array_iterator(x, size_t(N)) // Since _MSC_VER >= 1500 |
107 | /* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */ |
108 | # if defined(__INTEL_COMPILER) |
109 | # define Q_DECL_VARIABLE_DEPRECATED |
110 | # define Q_CC_INTEL __INTEL_COMPILER |
111 | # endif |
112 | |
113 | #elif defined(__BORLANDC__) || defined(__TURBOC__) |
114 | # define Q_CC_BOR |
115 | # define Q_INLINE_TEMPLATE |
116 | # if __BORLANDC__ < 0x502 |
117 | # error "Compiler not supported" |
118 | # endif |
119 | |
120 | #elif defined(__WATCOMC__) |
121 | # define Q_CC_WAT |
122 | |
123 | /* ARM Realview Compiler Suite |
124 | RVCT compiler also defines __EDG__ and __GNUC__ (if --gnu flag is given), |
125 | so check for it before that */ |
126 | #elif defined(__ARMCC__) || defined(__CC_ARM) |
127 | # define Q_CC_RVCT |
128 | /* work-around for missing compiler intrinsics */ |
129 | # define __is_empty(X) false |
130 | # define __is_pod(X) false |
131 | # define Q_DECL_DEPRECATED __attribute__ ((__deprecated__)) |
132 | # ifdef Q_OS_LINUX |
133 | # define Q_DECL_EXPORT __attribute__((visibility("default"))) |
134 | # define Q_DECL_IMPORT __attribute__((visibility("default"))) |
135 | # define Q_DECL_HIDDEN __attribute__((visibility("hidden"))) |
136 | # else |
137 | # define Q_DECL_EXPORT __declspec(dllexport) |
138 | # define Q_DECL_IMPORT __declspec(dllimport) |
139 | # endif |
140 | |
141 | #elif defined(__GNUC__) |
142 | # define Q_CC_GNU (__GNUC__ * 100 + __GNUC_MINOR__) |
143 | # if defined(__MINGW32__) |
144 | # define Q_CC_MINGW |
145 | # endif |
146 | # if defined(__INTEL_COMPILER) |
147 | /* Intel C++ also masquerades as GCC */ |
148 | # define Q_CC_INTEL (__INTEL_COMPILER) |
149 | # ifdef __clang__ |
150 | /* Intel C++ masquerades as Clang masquerading as GCC */ |
151 | # define Q_CC_CLANG 305 |
152 | # endif |
153 | # define Q_ASSUME_IMPL(expr) __assume(expr) |
154 | # define Q_UNREACHABLE_IMPL() __builtin_unreachable() |
155 | # if __INTEL_COMPILER >= 1300 && !defined(__APPLE__) |
156 | # define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text))) |
157 | # endif |
158 | # elif defined(__clang__) |
159 | /* Clang also masquerades as GCC */ |
160 | # if defined(__apple_build_version__) |
161 | # /* http://en.wikipedia.org/wiki/Xcode#Toolchain_Versions */ |
162 | # if __apple_build_version__ >= 8020041 |
163 | # define Q_CC_CLANG 309 |
164 | # elif __apple_build_version__ >= 8000038 |
165 | # define Q_CC_CLANG 308 |
166 | # elif __apple_build_version__ >= 7000053 |
167 | # define Q_CC_CLANG 306 |
168 | # elif __apple_build_version__ >= 6000051 |
169 | # define Q_CC_CLANG 305 |
170 | # elif __apple_build_version__ >= 5030038 |
171 | # define Q_CC_CLANG 304 |
172 | # elif __apple_build_version__ >= 5000275 |
173 | # define Q_CC_CLANG 303 |
174 | # elif __apple_build_version__ >= 4250024 |
175 | # define Q_CC_CLANG 302 |
176 | # elif __apple_build_version__ >= 3180045 |
177 | # define Q_CC_CLANG 301 |
178 | # elif __apple_build_version__ >= 2111001 |
179 | # define Q_CC_CLANG 300 |
180 | # else |
181 | # error "Unknown Apple Clang version" |
182 | # endif |
183 | # else |
184 | # define Q_CC_CLANG ((__clang_major__ * 100) + __clang_minor__) |
185 | # endif |
186 | # if __has_builtin(__builtin_assume) |
187 | # define Q_ASSUME_IMPL(expr) __builtin_assume(expr) |
188 | # else |
189 | # define Q_ASSUME_IMPL(expr) if (expr){} else __builtin_unreachable() |
190 | # endif |
191 | # define Q_UNREACHABLE_IMPL() __builtin_unreachable() |
192 | # if !defined(__has_extension) |
193 | # /* Compatibility with older Clang versions */ |
194 | # define __has_extension __has_feature |
195 | # endif |
196 | # if defined(__APPLE__) |
197 | /* Apple/clang specific features */ |
198 | # define Q_DECL_CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) |
199 | # ifdef __OBJC__ |
200 | # define Q_DECL_NS_RETURNS_AUTORELEASED __attribute__((ns_returns_autoreleased)) |
201 | # endif |
202 | # endif |
203 | # ifdef __EMSCRIPTEN__ |
204 | # define Q_CC_EMSCRIPTEN |
205 | # endif |
206 | # else |
207 | /* Plain GCC */ |
208 | # if Q_CC_GNU >= 405 |
209 | # define Q_ASSUME_IMPL(expr) if (expr){} else __builtin_unreachable() |
210 | # define Q_UNREACHABLE_IMPL() __builtin_unreachable() |
211 | # define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text))) |
212 | # endif |
213 | # endif |
214 | |
215 | # ifdef Q_OS_WIN |
216 | # define Q_DECL_EXPORT __declspec(dllexport) |
217 | # define Q_DECL_IMPORT __declspec(dllimport) |
218 | # elif defined(QT_VISIBILITY_AVAILABLE) |
219 | # define Q_DECL_EXPORT __attribute__((visibility("default"))) |
220 | # define Q_DECL_IMPORT __attribute__((visibility("default"))) |
221 | # define Q_DECL_HIDDEN __attribute__((visibility("hidden"))) |
222 | # endif |
223 | |
224 | # define Q_FUNC_INFO __PRETTY_FUNCTION__ |
225 | # define Q_ALIGNOF(type) __alignof__(type) |
226 | # define Q_TYPEOF(expr) __typeof__(expr) |
227 | # define Q_DECL_DEPRECATED __attribute__ ((__deprecated__)) |
228 | # define Q_DECL_ALIGN(n) __attribute__((__aligned__(n))) |
229 | # define Q_DECL_UNUSED __attribute__((__unused__)) |
230 | # define Q_LIKELY(expr) __builtin_expect(!!(expr), true) |
231 | # define Q_UNLIKELY(expr) __builtin_expect(!!(expr), false) |
232 | # define Q_NORETURN __attribute__((__noreturn__)) |
233 | # define Q_REQUIRED_RESULT __attribute__ ((__warn_unused_result__)) |
234 | # define Q_DECL_PURE_FUNCTION __attribute__((pure)) |
235 | # define Q_DECL_CONST_FUNCTION __attribute__((const)) |
236 | # define Q_DECL_COLD_FUNCTION __attribute__((cold)) |
237 | # if !defined(QT_MOC_CPP) |
238 | # define Q_PACKED __attribute__ ((__packed__)) |
239 | # ifndef __ARM_EABI__ |
240 | # define QT_NO_ARM_EABI |
241 | # endif |
242 | # endif |
243 | # if Q_CC_GNU >= 403 && !defined(Q_CC_CLANG) |
244 | # define Q_ALLOC_SIZE(x) __attribute__((alloc_size(x))) |
245 | # endif |
246 | |
247 | /* IBM compiler versions are a bit messy. There are actually two products: |
248 | the C product, and the C++ product. The C++ compiler is always packaged |
249 | with the latest version of the C compiler. Version numbers do not always |
250 | match. This little table (I'm not sure it's accurate) should be helpful: |
251 | |
252 | C++ product C product |
253 | |
254 | C Set 3.1 C Compiler 3.0 |
255 | ... ... |
256 | C++ Compiler 3.6.6 C Compiler 4.3 |
257 | ... ... |
258 | Visual Age C++ 4.0 ... |
259 | ... ... |
260 | Visual Age C++ 5.0 C Compiler 5.0 |
261 | ... ... |
262 | Visual Age C++ 6.0 C Compiler 6.0 |
263 | |
264 | Now: |
265 | __xlC__ is the version of the C compiler in hexadecimal notation |
266 | is only an approximation of the C++ compiler version |
267 | __IBMCPP__ is the version of the C++ compiler in decimal notation |
268 | but it is not defined on older compilers like C Set 3.1 */ |
269 | #elif defined(__xlC__) |
270 | # define Q_CC_XLC |
271 | # define Q_FULL_TEMPLATE_INSTANTIATION |
272 | # if __xlC__ < 0x400 |
273 | # error "Compiler not supported" |
274 | # elif __xlC__ >= 0x0600 |
275 | # define Q_ALIGNOF(type) __alignof__(type) |
276 | # define Q_TYPEOF(expr) __typeof__(expr) |
277 | # define Q_DECL_ALIGN(n) __attribute__((__aligned__(n))) |
278 | # define Q_PACKED __attribute__((__packed__)) |
279 | # endif |
280 | |
281 | /* Older versions of DEC C++ do not define __EDG__ or __EDG - observed |
282 | on DEC C++ V5.5-004. New versions do define __EDG__ - observed on |
283 | Compaq C++ V6.3-002. |
284 | This compiler is different enough from other EDG compilers to handle |
285 | it separately anyway. */ |
286 | #elif defined(__DECCXX) || defined(__DECC) |
287 | # define Q_CC_DEC |
288 | /* Compaq C++ V6 compilers are EDG-based but I'm not sure about older |
289 | DEC C++ V5 compilers. */ |
290 | # if defined(__EDG__) |
291 | # define Q_CC_EDG |
292 | # endif |
293 | /* Compaq has disabled EDG's _BOOL macro and uses _BOOL_EXISTS instead |
294 | - observed on Compaq C++ V6.3-002. |
295 | In any case versions prior to Compaq C++ V6.0-005 do not have bool. */ |
296 | # if !defined(_BOOL_EXISTS) |
297 | # error "Compiler not supported" |
298 | # endif |
299 | /* Spurious (?) error messages observed on Compaq C++ V6.5-014. */ |
300 | /* Apply to all versions prior to Compaq C++ V6.0-000 - observed on |
301 | DEC C++ V5.5-004. */ |
302 | # if __DECCXX_VER < 60060000 |
303 | # define Q_BROKEN_TEMPLATE_SPECIALIZATION |
304 | # endif |
305 | /* avoid undefined symbol problems with out-of-line template members */ |
306 | # define Q_OUTOFLINE_TEMPLATE inline |
307 | |
308 | /* The Portland Group C++ compiler is based on EDG and does define __EDG__ |
309 | but the C compiler does not */ |
310 | #elif defined(__PGI) |
311 | # define Q_CC_PGI |
312 | # if defined(__EDG__) |
313 | # define Q_CC_EDG |
314 | # endif |
315 | |
316 | /* Compilers with EDG front end are similar. To detect them we test: |
317 | __EDG documented by SGI, observed on MIPSpro 7.3.1.1 and KAI C++ 4.0b |
318 | __EDG__ documented in EDG online docs, observed on Compaq C++ V6.3-002 |
319 | and PGI C++ 5.2-4 */ |
320 | #elif !defined(Q_OS_HPUX) && (defined(__EDG) || defined(__EDG__)) |
321 | # define Q_CC_EDG |
322 | /* From the EDG documentation (does not seem to apply to Compaq C++ or GHS C): |
323 | _BOOL |
324 | Defined in C++ mode when bool is a keyword. The name of this |
325 | predefined macro is specified by a configuration flag. _BOOL |
326 | is the default. |
327 | __BOOL_DEFINED |
328 | Defined in Microsoft C++ mode when bool is a keyword. */ |
329 | # if !defined(_BOOL) && !defined(__BOOL_DEFINED) && !defined(__ghs) |
330 | # error "Compiler not supported" |
331 | # endif |
332 | |
333 | /* The Comeau compiler is based on EDG and does define __EDG__ */ |
334 | # if defined(__COMO__) |
335 | # define Q_CC_COMEAU |
336 | |
337 | /* The `using' keyword was introduced to avoid KAI C++ warnings |
338 | but it's now causing KAI C++ errors instead. The standard is |
339 | unclear about the use of this keyword, and in practice every |
340 | compiler is using its own set of rules. Forget it. */ |
341 | # elif defined(__KCC) |
342 | # define Q_CC_KAI |
343 | |
344 | /* Using the `using' keyword avoids Intel C++ for Linux warnings */ |
345 | # elif defined(__INTEL_COMPILER) |
346 | # define Q_CC_INTEL (__INTEL_COMPILER) |
347 | |
348 | /* Uses CFront, make sure to read the manual how to tweak templates. */ |
349 | # elif defined(__ghs) |
350 | # define Q_CC_GHS |
351 | # define Q_DECL_DEPRECATED __attribute__ ((__deprecated__)) |
352 | # define Q_PACKED __attribute__ ((__packed__)) |
353 | # define Q_FUNC_INFO __PRETTY_FUNCTION__ |
354 | # define Q_TYPEOF(expr) __typeof__(expr) |
355 | # define Q_ALIGNOF(type) __alignof__(type) |
356 | # define Q_UNREACHABLE_IMPL() |
357 | # if defined(__cplusplus) |
358 | # define Q_COMPILER_AUTO_TYPE |
359 | # define Q_COMPILER_STATIC_ASSERT |
360 | # define Q_COMPILER_RANGE_FOR |
361 | # if __GHS_VERSION_NUMBER >= 201505 |
362 | # define Q_COMPILER_ALIGNAS |
363 | # define Q_COMPILER_ALIGNOF |
364 | # define Q_COMPILER_ATOMICS |
365 | # define Q_COMPILER_ATTRIBUTES |
366 | # define Q_COMPILER_AUTO_FUNCTION |
367 | # define Q_COMPILER_CLASS_ENUM |
368 | # define Q_COMPILER_DECLTYPE |
369 | # define Q_COMPILER_DEFAULT_MEMBERS |
370 | # define Q_COMPILER_DELETE_MEMBERS |
371 | # define Q_COMPILER_DELEGATING_CONSTRUCTORS |
372 | # define Q_COMPILER_EXPLICIT_CONVERSIONS |
373 | # define Q_COMPILER_EXPLICIT_OVERRIDES |
374 | # define Q_COMPILER_EXTERN_TEMPLATES |
375 | # define Q_COMPILER_INHERITING_CONSTRUCTORS |
376 | # define Q_COMPILER_INITIALIZER_LISTS |
377 | # define Q_COMPILER_LAMBDA |
378 | # define Q_COMPILER_NONSTATIC_MEMBER_INIT |
379 | # define Q_COMPILER_NOEXCEPT |
380 | # define Q_COMPILER_NULLPTR |
381 | # define Q_COMPILER_RANGE_FOR |
382 | # define Q_COMPILER_RAW_STRINGS |
383 | # define Q_COMPILER_REF_QUALIFIERS |
384 | # define Q_COMPILER_RVALUE_REFS |
385 | # define Q_COMPILER_STATIC_ASSERT |
386 | # define Q_COMPILER_TEMPLATE_ALIAS |
387 | # define Q_COMPILER_THREAD_LOCAL |
388 | # define Q_COMPILER_THREADSAFE_STATICS |
389 | # define Q_COMPILER_UDL |
390 | # define Q_COMPILER_UNICODE_STRINGS |
391 | # define Q_COMPILER_UNIFORM_INIT |
392 | # define Q_COMPILER_UNRESTRICTED_UNIONS |
393 | # define Q_COMPILER_VARIADIC_MACROS |
394 | # define Q_COMPILER_VARIADIC_TEMPLATES |
395 | # endif |
396 | # endif //__cplusplus |
397 | |
398 | # elif defined(__DCC__) |
399 | # define Q_CC_DIAB |
400 | # if !defined(__bool) |
401 | # error "Compiler not supported" |
402 | # endif |
403 | |
404 | /* The UnixWare 7 UDK compiler is based on EDG and does define __EDG__ */ |
405 | # elif defined(__USLC__) && defined(__SCO_VERSION__) |
406 | # define Q_CC_USLC |
407 | /* The latest UDK 7.1.1b does not need this, but previous versions do */ |
408 | # if !defined(__SCO_VERSION__) || (__SCO_VERSION__ < 302200010) |
409 | # define Q_OUTOFLINE_TEMPLATE inline |
410 | # endif |
411 | |
412 | /* Never tested! */ |
413 | # elif defined(CENTERLINE_CLPP) || defined(OBJECTCENTER) |
414 | # define Q_CC_OC |
415 | |
416 | /* CDS++ defines __EDG__ although this is not documented in the Reliant |
417 | documentation. It also follows conventions like _BOOL and this documented */ |
418 | # elif defined(sinix) |
419 | # define Q_CC_CDS |
420 | |
421 | /* The MIPSpro compiler defines __EDG */ |
422 | # elif defined(__sgi) |
423 | # define Q_CC_MIPS |
424 | # define Q_NO_TEMPLATE_FRIENDS |
425 | # if defined(_COMPILER_VERSION) && (_COMPILER_VERSION >= 740) |
426 | # define Q_OUTOFLINE_TEMPLATE inline |
427 | # pragma set woff 3624,3625,3649 /* turn off some harmless warnings */ |
428 | # endif |
429 | # endif |
430 | |
431 | /* VxWorks' DIAB toolchain has an additional EDG type C++ compiler |
432 | (see __DCC__ above). This one is for C mode files (__EDG is not defined) */ |
433 | #elif defined(_DIAB_TOOL) |
434 | # define Q_CC_DIAB |
435 | # define Q_FUNC_INFO __PRETTY_FUNCTION__ |
436 | |
437 | /* Never tested! */ |
438 | #elif defined(__HIGHC__) |
439 | # define Q_CC_HIGHC |
440 | |
441 | #elif defined(__SUNPRO_CC) || defined(__SUNPRO_C) |
442 | # define Q_CC_SUN |
443 | # define Q_COMPILER_MANGLES_RETURN_TYPE |
444 | /* 5.0 compiler or better |
445 | 'bool' is enabled by default but can be disabled using -features=nobool |
446 | in which case _BOOL is not defined |
447 | this is the default in 4.2 compatibility mode triggered by -compat=4 */ |
448 | # if __SUNPRO_CC >= 0x500 |
449 | # define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS |
450 | /* see http://developers.sun.com/sunstudio/support/Ccompare.html */ |
451 | # if __SUNPRO_CC >= 0x590 |
452 | # define Q_ALIGNOF(type) __alignof__(type) |
453 | # define Q_TYPEOF(expr) __typeof__(expr) |
454 | # define Q_DECL_ALIGN(n) __attribute__((__aligned__(n))) |
455 | # endif |
456 | # if __SUNPRO_CC >= 0x550 |
457 | # define Q_DECL_EXPORT __global |
458 | # endif |
459 | # if __SUNPRO_CC < 0x5a0 |
460 | # define Q_NO_TEMPLATE_FRIENDS |
461 | # endif |
462 | # if !defined(_BOOL) |
463 | # error "Compiler not supported" |
464 | # endif |
465 | /* 4.2 compiler or older */ |
466 | # else |
467 | # error "Compiler not supported" |
468 | # endif |
469 | |
470 | /* CDS++ does not seem to define __EDG__ or __EDG according to Reliant |
471 | documentation but nevertheless uses EDG conventions like _BOOL */ |
472 | #elif defined(sinix) |
473 | # define Q_CC_EDG |
474 | # define Q_CC_CDS |
475 | # if !defined(_BOOL) |
476 | # error "Compiler not supported" |
477 | # endif |
478 | # define Q_BROKEN_TEMPLATE_SPECIALIZATION |
479 | |
480 | #elif defined(Q_OS_HPUX) |
481 | /* __HP_aCC was not defined in first aCC releases */ |
482 | # if defined(__HP_aCC) || __cplusplus >= 199707L |
483 | # define Q_NO_TEMPLATE_FRIENDS |
484 | # define Q_CC_HPACC |
485 | # define Q_FUNC_INFO __PRETTY_FUNCTION__ |
486 | # if __HP_aCC-0 < 060000 |
487 | # define QT_NO_TEMPLATE_TEMPLATE_PARAMETERS |
488 | # define Q_DECL_EXPORT __declspec(dllexport) |
489 | # define Q_DECL_IMPORT __declspec(dllimport) |
490 | # endif |
491 | # if __HP_aCC-0 >= 061200 |
492 | # define Q_DECL_ALIGN(n) __attribute__((aligned(n))) |
493 | # endif |
494 | # if __HP_aCC-0 >= 062000 |
495 | # define Q_DECL_EXPORT __attribute__((visibility("default"))) |
496 | # define Q_DECL_HIDDEN __attribute__((visibility("hidden"))) |
497 | # define Q_DECL_IMPORT Q_DECL_EXPORT |
498 | # endif |
499 | # else |
500 | # error "Compiler not supported" |
501 | # endif |
502 | |
503 | #else |
504 | # error "Qt has not been tested with this compiler - see http://www.qt-project.org/" |
505 | #endif |
506 | |
507 | /* |
508 | * SG10's SD-6 feature detection and some useful extensions from Clang and GCC |
509 | * https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations |
510 | * http://clang.llvm.org/docs/LanguageExtensions.html#feature-checking-macros |
511 | * Not using wrapper macros, per http://eel.is/c++draft/cpp.cond#7.sentence-2 |
512 | */ |
513 | #ifndef __has_builtin |
514 | # define __has_builtin(x) 0 |
515 | #endif |
516 | #ifndef __has_feature |
517 | # define __has_feature(x) 0 |
518 | #endif |
519 | #ifndef __has_attribute |
520 | # define __has_attribute(x) 0 |
521 | #endif |
522 | #ifndef __has_cpp_attribute |
523 | # define __has_cpp_attribute(x) 0 |
524 | #endif |
525 | #ifndef __has_include |
526 | # define __has_include(x) 0 |
527 | #endif |
528 | #ifndef __has_include_next |
529 | # define __has_include_next(x) 0 |
530 | #endif |
531 | |
532 | // Kept around until all submodules have transitioned |
533 | #define QT_HAS_BUILTIN(x) __has_builtin(x) |
534 | #define QT_HAS_FEATURE(x) __has_feature(x) |
535 | #define QT_HAS_ATTRIBUTE(x) __has_attribute(x) |
536 | #define QT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) |
537 | #define QT_HAS_INCLUDE(x) __has_include(x) |
538 | #define QT_HAS_INCLUDE_NEXT(x) __has_include_next(x) |
539 | |
540 | /* |
541 | * C++11 support |
542 | * |
543 | * Paper Macro SD-6 macro |
544 | * N2341 Q_COMPILER_ALIGNAS |
545 | * N2341 Q_COMPILER_ALIGNOF |
546 | * N2427 Q_COMPILER_ATOMICS |
547 | * N2761 Q_COMPILER_ATTRIBUTES __cpp_attributes = 200809 |
548 | * N2541 Q_COMPILER_AUTO_FUNCTION |
549 | * N1984 N2546 Q_COMPILER_AUTO_TYPE |
550 | * N2437 Q_COMPILER_CLASS_ENUM |
551 | * N2235 Q_COMPILER_CONSTEXPR __cpp_constexpr = 200704 |
552 | * N2343 N3276 Q_COMPILER_DECLTYPE __cpp_decltype = 200707 |
553 | * N2346 Q_COMPILER_DEFAULT_MEMBERS |
554 | * N2346 Q_COMPILER_DELETE_MEMBERS |
555 | * N1986 Q_COMPILER_DELEGATING_CONSTRUCTORS |
556 | * N2437 Q_COMPILER_EXPLICIT_CONVERSIONS |
557 | * N3206 N3272 Q_COMPILER_EXPLICIT_OVERRIDES |
558 | * N1987 Q_COMPILER_EXTERN_TEMPLATES |
559 | * N2540 Q_COMPILER_INHERITING_CONSTRUCTORS |
560 | * N2672 Q_COMPILER_INITIALIZER_LISTS |
561 | * N2658 N2927 Q_COMPILER_LAMBDA __cpp_lambdas = 200907 |
562 | * N2756 Q_COMPILER_NONSTATIC_MEMBER_INIT |
563 | * N2855 N3050 Q_COMPILER_NOEXCEPT |
564 | * N2431 Q_COMPILER_NULLPTR |
565 | * N2930 Q_COMPILER_RANGE_FOR |
566 | * N2442 Q_COMPILER_RAW_STRINGS __cpp_raw_strings = 200710 |
567 | * N2439 Q_COMPILER_REF_QUALIFIERS |
568 | * N2118 N2844 N3053 Q_COMPILER_RVALUE_REFS __cpp_rvalue_references = 200610 |
569 | * N1720 Q_COMPILER_STATIC_ASSERT __cpp_static_assert = 200410 |
570 | * N2258 Q_COMPILER_TEMPLATE_ALIAS |
571 | * N2659 Q_COMPILER_THREAD_LOCAL |
572 | * N2660 Q_COMPILER_THREADSAFE_STATICS |
573 | * N2765 Q_COMPILER_UDL __cpp_user_defined_literals = 200809 |
574 | * N2442 Q_COMPILER_UNICODE_STRINGS __cpp_unicode_literals = 200710 |
575 | * N2640 Q_COMPILER_UNIFORM_INIT |
576 | * N2544 Q_COMPILER_UNRESTRICTED_UNIONS |
577 | * N1653 Q_COMPILER_VARIADIC_MACROS |
578 | * N2242 N2555 Q_COMPILER_VARIADIC_TEMPLATES __cpp_variadic_templates = 200704 |
579 | * |
580 | * For any future version of the C++ standard, we use only the SD-6 macro. |
581 | * For full listing, see |
582 | * http://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations |
583 | * |
584 | * C++ extensions: |
585 | * Q_COMPILER_RESTRICTED_VLA variable-length arrays, prior to __cpp_runtime_arrays |
586 | */ |
587 | |
588 | #ifdef __cplusplus |
589 | # if __cplusplus < 201103L && !defined(Q_CC_MSVC) |
590 | # error Qt requires a C++11 compiler and yours does not seem to be that. |
591 | # endif |
592 | #endif |
593 | |
594 | #if defined(Q_CC_INTEL) && !defined(Q_CC_MSVC) |
595 | # define Q_COMPILER_RESTRICTED_VLA |
596 | # define Q_COMPILER_VARIADIC_MACROS // C++11 feature supported as an extension in other modes, too |
597 | # define Q_COMPILER_THREADSAFE_STATICS |
598 | # if __INTEL_COMPILER < 1200 |
599 | # define Q_NO_TEMPLATE_FRIENDS |
600 | # endif |
601 | # if __INTEL_COMPILER >= 1310 && !defined(_WIN32) |
602 | // ICC supports C++14 binary literals in C, C++98, and C++11 modes |
603 | // at least since 13.1, but I can't test further back |
604 | # define Q_COMPILER_BINARY_LITERALS |
605 | # endif |
606 | # if __cplusplus >= 201103L || defined(__INTEL_CXX11_MODE__) |
607 | # if __INTEL_COMPILER >= 1200 |
608 | # define Q_COMPILER_AUTO_TYPE |
609 | # define Q_COMPILER_CLASS_ENUM |
610 | # define Q_COMPILER_DECLTYPE |
611 | # define Q_COMPILER_DEFAULT_MEMBERS |
612 | # define Q_COMPILER_DELETE_MEMBERS |
613 | # define Q_COMPILER_EXTERN_TEMPLATES |
614 | # define Q_COMPILER_LAMBDA |
615 | # define Q_COMPILER_RVALUE_REFS |
616 | # define Q_COMPILER_STATIC_ASSERT |
617 | # define Q_COMPILER_VARIADIC_MACROS |
618 | # endif |
619 | # if __INTEL_COMPILER >= 1210 |
620 | # define Q_COMPILER_ATTRIBUTES |
621 | # define Q_COMPILER_AUTO_FUNCTION |
622 | # define Q_COMPILER_NULLPTR |
623 | # define Q_COMPILER_TEMPLATE_ALIAS |
624 | # ifndef _CHAR16T // MSVC headers |
625 | # define Q_COMPILER_UNICODE_STRINGS |
626 | # endif |
627 | # define Q_COMPILER_VARIADIC_TEMPLATES |
628 | # endif |
629 | # if __INTEL_COMPILER >= 1300 |
630 | # define Q_COMPILER_ATOMICS |
631 | // constexpr support is only partial |
632 | //# define Q_COMPILER_CONSTEXPR |
633 | # define Q_COMPILER_INITIALIZER_LISTS |
634 | # define Q_COMPILER_UNIFORM_INIT |
635 | # define Q_COMPILER_NOEXCEPT |
636 | # endif |
637 | # if __INTEL_COMPILER >= 1400 |
638 | // causes issues with QArrayData and QtPrivate::RefCount - Intel issue ID 6000056211, bug DPD200534796 |
639 | //# define Q_COMPILER_CONSTEXPR |
640 | # define Q_COMPILER_DELEGATING_CONSTRUCTORS |
641 | # define Q_COMPILER_EXPLICIT_CONVERSIONS |
642 | # define Q_COMPILER_EXPLICIT_OVERRIDES |
643 | # define Q_COMPILER_NONSTATIC_MEMBER_INIT |
644 | # define Q_COMPILER_RANGE_FOR |
645 | # define Q_COMPILER_RAW_STRINGS |
646 | # define Q_COMPILER_REF_QUALIFIERS |
647 | # define Q_COMPILER_UNICODE_STRINGS |
648 | # define Q_COMPILER_UNRESTRICTED_UNIONS |
649 | # endif |
650 | # if __INTEL_COMPILER >= 1500 |
651 | # if __INTEL_COMPILER * 100 + __INTEL_COMPILER_UPDATE >= 150001 |
652 | // the bug mentioned above is fixed in 15.0.1 |
653 | # define Q_COMPILER_CONSTEXPR |
654 | # endif |
655 | # define Q_COMPILER_ALIGNAS |
656 | # define Q_COMPILER_ALIGNOF |
657 | # define Q_COMPILER_INHERITING_CONSTRUCTORS |
658 | # define Q_COMPILER_THREAD_LOCAL |
659 | # define Q_COMPILER_UDL |
660 | # endif |
661 | # elif defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L |
662 | // C11 features supported. Only tested with ICC 17 and up. |
663 | # define Q_COMPILER_STATIC_ASSERT |
664 | # if __has_include(<threads.h>) |
665 | # define Q_COMPILER_THREAD_LOCAL |
666 | # endif |
667 | # endif |
668 | #endif |
669 | |
670 | #if defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) && !defined(Q_CC_MSVC) |
671 | /* General C++ features */ |
672 | # define Q_COMPILER_RESTRICTED_VLA |
673 | # define Q_COMPILER_THREADSAFE_STATICS |
674 | # if __has_feature(attribute_deprecated_with_message) |
675 | # define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text))) |
676 | # endif |
677 | |
678 | // Clang supports binary literals in C, C++98 and C++11 modes |
679 | // It's been supported "since the dawn of time itself" (cf. commit 179883) |
680 | # if __has_extension(cxx_binary_literals) |
681 | # define Q_COMPILER_BINARY_LITERALS |
682 | # endif |
683 | |
684 | // Variadic macros are supported for gnu++98, c++11, c99 ... since 2.9 |
685 | # if Q_CC_CLANG >= 209 |
686 | # if !defined(__STRICT_ANSI__) || defined(__GXX_EXPERIMENTAL_CXX0X__) \ |
687 | || (defined(__cplusplus) && (__cplusplus >= 201103L)) \ |
688 | || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) |
689 | # define Q_COMPILER_VARIADIC_MACROS |
690 | # endif |
691 | # endif |
692 | |
693 | /* C++11 features, see http://clang.llvm.org/cxx_status.html */ |
694 | # if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) |
695 | /* Detect C++ features using __has_feature(), see http://clang.llvm.org/docs/LanguageExtensions.html#cxx11 */ |
696 | # if __has_feature(cxx_alignas) |
697 | # define Q_COMPILER_ALIGNAS |
698 | # define Q_COMPILER_ALIGNOF |
699 | # endif |
700 | # if __has_feature(cxx_atomic) && __has_include(<atomic>) |
701 | # define Q_COMPILER_ATOMICS |
702 | # endif |
703 | # if __has_feature(cxx_attributes) |
704 | # define Q_COMPILER_ATTRIBUTES |
705 | # endif |
706 | # if __has_feature(cxx_auto_type) |
707 | # define Q_COMPILER_AUTO_FUNCTION |
708 | # define Q_COMPILER_AUTO_TYPE |
709 | # endif |
710 | # if __has_feature(cxx_strong_enums) |
711 | # define Q_COMPILER_CLASS_ENUM |
712 | # endif |
713 | # if __has_feature(cxx_constexpr) && Q_CC_CLANG > 302 /* CLANG 3.2 has bad/partial support */ |
714 | # define Q_COMPILER_CONSTEXPR |
715 | # endif |
716 | # if __has_feature(cxx_decltype) /* && __has_feature(cxx_decltype_incomplete_return_types) */ |
717 | # define Q_COMPILER_DECLTYPE |
718 | # endif |
719 | # if __has_feature(cxx_defaulted_functions) |
720 | # define Q_COMPILER_DEFAULT_MEMBERS |
721 | # endif |
722 | # if __has_feature(cxx_deleted_functions) |
723 | # define Q_COMPILER_DELETE_MEMBERS |
724 | # endif |
725 | # if __has_feature(cxx_delegating_constructors) |
726 | # define Q_COMPILER_DELEGATING_CONSTRUCTORS |
727 | # endif |
728 | # if __has_feature(cxx_explicit_conversions) |
729 | # define Q_COMPILER_EXPLICIT_CONVERSIONS |
730 | # endif |
731 | # if __has_feature(cxx_override_control) |
732 | # define Q_COMPILER_EXPLICIT_OVERRIDES |
733 | # endif |
734 | # if __has_feature(cxx_inheriting_constructors) |
735 | # define Q_COMPILER_INHERITING_CONSTRUCTORS |
736 | # endif |
737 | # if __has_feature(cxx_generalized_initializers) |
738 | # define Q_COMPILER_INITIALIZER_LISTS |
739 | # define Q_COMPILER_UNIFORM_INIT /* both covered by this feature macro, according to docs */ |
740 | # endif |
741 | # if __has_feature(cxx_lambdas) |
742 | # define Q_COMPILER_LAMBDA |
743 | # endif |
744 | # if __has_feature(cxx_noexcept) |
745 | # define Q_COMPILER_NOEXCEPT |
746 | # endif |
747 | # if __has_feature(cxx_nonstatic_member_init) |
748 | # define Q_COMPILER_NONSTATIC_MEMBER_INIT |
749 | # endif |
750 | # if __has_feature(cxx_nullptr) |
751 | # define Q_COMPILER_NULLPTR |
752 | # endif |
753 | # if __has_feature(cxx_range_for) |
754 | # define Q_COMPILER_RANGE_FOR |
755 | # endif |
756 | # if __has_feature(cxx_raw_string_literals) |
757 | # define Q_COMPILER_RAW_STRINGS |
758 | # endif |
759 | # if __has_feature(cxx_reference_qualified_functions) |
760 | # define Q_COMPILER_REF_QUALIFIERS |
761 | # endif |
762 | # if __has_feature(cxx_rvalue_references) |
763 | # define Q_COMPILER_RVALUE_REFS |
764 | # endif |
765 | # if __has_feature(cxx_static_assert) |
766 | # define Q_COMPILER_STATIC_ASSERT |
767 | # endif |
768 | # if __has_feature(cxx_alias_templates) |
769 | # define Q_COMPILER_TEMPLATE_ALIAS |
770 | # endif |
771 | # if __has_feature(cxx_thread_local) |
772 | # if !defined(__FreeBSD__) /* FreeBSD clang fails on __cxa_thread_atexit */ |
773 | # define Q_COMPILER_THREAD_LOCAL |
774 | # endif |
775 | # endif |
776 | # if __has_feature(cxx_user_literals) |
777 | # define Q_COMPILER_UDL |
778 | # endif |
779 | # if __has_feature(cxx_unicode_literals) |
780 | # define Q_COMPILER_UNICODE_STRINGS |
781 | # endif |
782 | # if __has_feature(cxx_unrestricted_unions) |
783 | # define Q_COMPILER_UNRESTRICTED_UNIONS |
784 | # endif |
785 | # if __has_feature(cxx_variadic_templates) |
786 | # define Q_COMPILER_VARIADIC_TEMPLATES |
787 | # endif |
788 | /* Features that have no __has_feature() check */ |
789 | # if Q_CC_CLANG >= 209 /* since clang 2.9 */ |
790 | # define Q_COMPILER_EXTERN_TEMPLATES |
791 | # endif |
792 | # endif |
793 | |
794 | /* C++1y features, deprecated macros. Do not update this list. */ |
795 | # if __cplusplus > 201103L |
796 | //# if __has_feature(cxx_binary_literals) |
797 | //# define Q_COMPILER_BINARY_LITERALS // see above |
798 | //# endif |
799 | # if __has_feature(cxx_generic_lambda) |
800 | # define Q_COMPILER_GENERIC_LAMBDA |
801 | # endif |
802 | # if __has_feature(cxx_init_capture) |
803 | # define Q_COMPILER_LAMBDA_CAPTURES |
804 | # endif |
805 | # if __has_feature(cxx_relaxed_constexpr) |
806 | # define Q_COMPILER_RELAXED_CONSTEXPR_FUNCTIONS |
807 | # endif |
808 | # if __has_feature(cxx_decltype_auto) && __has_feature(cxx_return_type_deduction) |
809 | # define Q_COMPILER_RETURN_TYPE_DEDUCTION |
810 | # endif |
811 | # if __has_feature(cxx_variable_templates) |
812 | # define Q_COMPILER_VARIABLE_TEMPLATES |
813 | # endif |
814 | # if __has_feature(cxx_runtime_array) |
815 | # define Q_COMPILER_VLA |
816 | # endif |
817 | # endif |
818 | |
819 | # if defined(__STDC_VERSION__) |
820 | # if __has_feature(c_static_assert) |
821 | # define Q_COMPILER_STATIC_ASSERT |
822 | # endif |
823 | # if __has_feature(c_thread_local) && __has_include(<threads.h>) |
824 | # if !defined(__FreeBSD__) /* FreeBSD clang fails on __cxa_thread_atexit */ |
825 | # define Q_COMPILER_THREAD_LOCAL |
826 | # endif |
827 | # endif |
828 | # endif |
829 | |
830 | #endif // Q_CC_CLANG && !Q_CC_INTEL && !Q_CC_MSVC |
831 | |
832 | #if defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) |
833 | # ifndef Q_DECL_UNUSED |
834 | # define Q_DECL_UNUSED __attribute__((__unused__)) |
835 | # endif |
836 | # define Q_DECL_UNUSED_MEMBER Q_DECL_UNUSED |
837 | #endif |
838 | |
839 | #if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) |
840 | # define Q_COMPILER_RESTRICTED_VLA |
841 | # define Q_COMPILER_THREADSAFE_STATICS |
842 | # if Q_CC_GNU >= 403 |
843 | // GCC supports binary literals in C, C++98 and C++11 modes |
844 | # define Q_COMPILER_BINARY_LITERALS |
845 | # endif |
846 | # if !defined(__STRICT_ANSI__) || defined(__GXX_EXPERIMENTAL_CXX0X__) \ |
847 | || (defined(__cplusplus) && (__cplusplus >= 201103L)) \ |
848 | || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) |
849 | // Variadic macros are supported for gnu++98, c++11, C99 ... since forever (gcc 2.97) |
850 | # define Q_COMPILER_VARIADIC_MACROS |
851 | # endif |
852 | # if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L |
853 | # if Q_CC_GNU >= 403 |
854 | /* C++11 features supported in GCC 4.3: */ |
855 | # define Q_COMPILER_DECLTYPE |
856 | # define Q_COMPILER_RVALUE_REFS |
857 | # define Q_COMPILER_STATIC_ASSERT |
858 | # endif |
859 | # if Q_CC_GNU >= 404 |
860 | /* C++11 features supported in GCC 4.4: */ |
861 | # define Q_COMPILER_AUTO_FUNCTION |
862 | # define Q_COMPILER_AUTO_TYPE |
863 | # define Q_COMPILER_EXTERN_TEMPLATES |
864 | # define Q_COMPILER_UNIFORM_INIT |
865 | # define Q_COMPILER_UNICODE_STRINGS |
866 | # define Q_COMPILER_VARIADIC_TEMPLATES |
867 | # endif |
868 | # if Q_CC_GNU >= 405 |
869 | /* C++11 features supported in GCC 4.5: */ |
870 | # define Q_COMPILER_EXPLICIT_CONVERSIONS |
871 | /* GCC 4.4 implements initializer_list but does not define typedefs required |
872 | * by the standard. */ |
873 | # define Q_COMPILER_INITIALIZER_LISTS |
874 | # define Q_COMPILER_LAMBDA |
875 | # define Q_COMPILER_RAW_STRINGS |
876 | # define Q_COMPILER_CLASS_ENUM |
877 | # endif |
878 | # if Q_CC_GNU >= 406 |
879 | /* Pre-4.6 compilers implement a non-final snapshot of N2346, hence default and delete |
880 | * functions are supported only if they are public. Starting from 4.6, GCC handles |
881 | * final version - the access modifier is not relevant. */ |
882 | # define Q_COMPILER_DEFAULT_MEMBERS |
883 | # define Q_COMPILER_DELETE_MEMBERS |
884 | /* C++11 features supported in GCC 4.6: */ |
885 | # define Q_COMPILER_NULLPTR |
886 | # define Q_COMPILER_UNRESTRICTED_UNIONS |
887 | # define Q_COMPILER_RANGE_FOR |
888 | # endif |
889 | # if Q_CC_GNU >= 407 |
890 | /* GCC 4.4 implemented <atomic> and std::atomic using its old intrinsics. |
891 | * However, the implementation is incomplete for most platforms until GCC 4.7: |
892 | * instead, std::atomic would use an external lock. Since we need an std::atomic |
893 | * that is behavior-compatible with QBasicAtomic, we only enable it here */ |
894 | # define Q_COMPILER_ATOMICS |
895 | /* GCC 4.6.x has problems dealing with noexcept expressions, |
896 | * so turn the feature on for 4.7 and above, only */ |
897 | # define Q_COMPILER_NOEXCEPT |
898 | /* C++11 features supported in GCC 4.7: */ |
899 | # define Q_COMPILER_NONSTATIC_MEMBER_INIT |
900 | # define Q_COMPILER_DELEGATING_CONSTRUCTORS |
901 | # define Q_COMPILER_EXPLICIT_OVERRIDES |
902 | # define Q_COMPILER_TEMPLATE_ALIAS |
903 | # define Q_COMPILER_UDL |
904 | # endif |
905 | # if Q_CC_GNU >= 408 |
906 | # define Q_COMPILER_ATTRIBUTES |
907 | # define Q_COMPILER_ALIGNAS |
908 | # define Q_COMPILER_ALIGNOF |
909 | # define Q_COMPILER_INHERITING_CONSTRUCTORS |
910 | # define Q_COMPILER_THREAD_LOCAL |
911 | # if Q_CC_GNU > 408 || __GNUC_PATCHLEVEL__ >= 1 |
912 | # define Q_COMPILER_REF_QUALIFIERS |
913 | # endif |
914 | # endif |
915 | # if Q_CC_GNU >= 500 |
916 | /* GCC 4.6 introduces constexpr, but it's bugged (at least) in the whole |
917 | * 4.x series, see e.g. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 */ |
918 | # define Q_COMPILER_CONSTEXPR |
919 | # endif |
920 | # endif |
921 | # if __cplusplus > 201103L |
922 | # if Q_CC_GNU >= 409 |
923 | /* C++1y features in GCC 4.9 - deprecated, do not update this list */ |
924 | //# define Q_COMPILER_BINARY_LITERALS // already supported since GCC 4.3 as an extension |
925 | # define Q_COMPILER_LAMBDA_CAPTURES |
926 | # define Q_COMPILER_RETURN_TYPE_DEDUCTION |
927 | # endif |
928 | # endif |
929 | # if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L |
930 | # if Q_CC_GNU >= 407 |
931 | /* C11 features supported in GCC 4.7: */ |
932 | # define Q_COMPILER_STATIC_ASSERT |
933 | # endif |
934 | # if Q_CC_GNU >= 409 && defined(__has_include) |
935 | /* C11 features supported in GCC 4.9: */ |
936 | # if __has_include(<threads.h>) |
937 | # define Q_COMPILER_THREAD_LOCAL |
938 | # endif |
939 | # endif |
940 | # endif |
941 | #endif |
942 | |
943 | #if defined(Q_CC_MSVC) |
944 | # if defined(__cplusplus) |
945 | /* C++11 features supported in VC8 = VC2005: */ |
946 | # define Q_COMPILER_VARIADIC_MACROS |
947 | |
948 | /* 2005 supports the override and final contextual keywords, in |
949 | the same positions as the C++11 variants, but 'final' is |
950 | called 'sealed' instead: |
951 | http://msdn.microsoft.com/en-us/library/0w2w91tf%28v=vs.80%29.aspx |
952 | The behavior is slightly different in C++/CLI, which requires the |
953 | "virtual" keyword to be present too, so don't define for that. |
954 | So don't define Q_COMPILER_EXPLICIT_OVERRIDES (since it's not |
955 | the same as the C++11 version), but define the Q_DECL_* flags |
956 | accordingly. */ |
957 | /* C++11 features supported in VC10 = VC2010: */ |
958 | # define Q_COMPILER_AUTO_FUNCTION |
959 | # define Q_COMPILER_AUTO_TYPE |
960 | # define Q_COMPILER_DECLTYPE |
961 | # define Q_COMPILER_EXTERN_TEMPLATES |
962 | # define Q_COMPILER_LAMBDA |
963 | # define Q_COMPILER_NULLPTR |
964 | # define Q_COMPILER_RVALUE_REFS |
965 | # define Q_COMPILER_STATIC_ASSERT |
966 | /* C++11 features supported in VC11 = VC2012: */ |
967 | # define Q_COMPILER_EXPLICIT_OVERRIDES /* ...and use std C++11 now */ |
968 | # define Q_COMPILER_CLASS_ENUM |
969 | # define Q_COMPILER_ATOMICS |
970 | /* C++11 features in VC12 = VC2013 */ |
971 | # define Q_COMPILER_DELETE_MEMBERS |
972 | # define Q_COMPILER_DELEGATING_CONSTRUCTORS |
973 | # define Q_COMPILER_EXPLICIT_CONVERSIONS |
974 | # define Q_COMPILER_NONSTATIC_MEMBER_INIT |
975 | # define Q_COMPILER_RAW_STRINGS |
976 | # define Q_COMPILER_TEMPLATE_ALIAS |
977 | # define Q_COMPILER_VARIADIC_TEMPLATES |
978 | # define Q_COMPILER_INITIALIZER_LISTS // VC 12 SP 2 RC |
979 | /* C++11 features in VC14 = VC2015 */ |
980 | # define Q_COMPILER_DEFAULT_MEMBERS |
981 | # define Q_COMPILER_ALIGNAS |
982 | # define Q_COMPILER_ALIGNOF |
983 | # define Q_COMPILER_INHERITING_CONSTRUCTORS |
984 | # define Q_COMPILER_NOEXCEPT |
985 | # define Q_COMPILER_RANGE_FOR |
986 | # define Q_COMPILER_REF_QUALIFIERS |
987 | # define Q_COMPILER_THREAD_LOCAL |
988 | # define Q_COMPILER_UDL |
989 | # define Q_COMPILER_UNICODE_STRINGS |
990 | # define Q_COMPILER_UNRESTRICTED_UNIONS |
991 | # if _MSC_FULL_VER >= 190023419 |
992 | # define Q_COMPILER_ATTRIBUTES |
993 | // Almost working, see https://connect.microsoft.com/VisualStudio/feedback/details/2011648 |
994 | //# define Q_COMPILER_CONSTEXPR |
995 | # define Q_COMPILER_THREADSAFE_STATICS |
996 | # define Q_COMPILER_UNIFORM_INIT |
997 | # endif |
998 | # if _MSC_VER >= 1910 |
999 | # define Q_COMPILER_CONSTEXPR |
1000 | # endif |
1001 | # endif /* __cplusplus */ |
1002 | #endif /* Q_CC_MSVC */ |
1003 | |
1004 | #ifdef Q_COMPILER_UNICODE_STRINGS |
1005 | # define Q_STDLIB_UNICODE_STRINGS |
1006 | #endif |
1007 | |
1008 | #ifdef __cplusplus |
1009 | # include <utility> |
1010 | # if defined(Q_OS_QNX) |
1011 | // By default, QNX 7.0 uses libc++ (from LLVM) and |
1012 | // QNX 6.X uses Dinkumware's libcpp. In all versions, |
1013 | // it is also possible to use GNU libstdc++. |
1014 | |
1015 | // For Dinkumware, some features must be disabled |
1016 | // (mostly because of library problems). |
1017 | // Dinkumware is assumed when __GLIBCXX__ (GNU libstdc++) |
1018 | // and _LIBCPP_VERSION (LLVM libc++) are both absent. |
1019 | # if !defined(__GLIBCXX__) && !defined(_LIBCPP_VERSION) |
1020 | |
1021 | // Older versions of libcpp (QNX 650) do not support C++11 features |
1022 | // _HAS_* macros are set to 1 by toolchains that actually include |
1023 | // Dinkum C++11 libcpp. |
1024 | |
1025 | # if !defined(_HAS_CPP0X) || !_HAS_CPP0X |
1026 | // Disable C++11 features that depend on library support |
1027 | # undef Q_COMPILER_INITIALIZER_LISTS |
1028 | # undef Q_COMPILER_RVALUE_REFS |
1029 | # undef Q_COMPILER_REF_QUALIFIERS |
1030 | # undef Q_COMPILER_NOEXCEPT |
1031 | // Disable C++11 library features: |
1032 | # undef Q_STDLIB_UNICODE_STRINGS |
1033 | # endif // !_HAS_CPP0X |
1034 | # if !defined(_HAS_NULLPTR_T) || !_HAS_NULLPTR_T |
1035 | # undef Q_COMPILER_NULLPTR |
1036 | # endif //!_HAS_NULLPTR_T |
1037 | # if !defined(_HAS_CONSTEXPR) || !_HAS_CONSTEXPR |
1038 | // The libcpp is missing constexpr keywords on important functions like std::numeric_limits<>::min() |
1039 | // Disable constexpr support on QNX even if the compiler supports it |
1040 | # undef Q_COMPILER_CONSTEXPR |
1041 | # endif // !_HAS_CONSTEXPR |
1042 | # endif // !__GLIBCXX__ && !_LIBCPP_VERSION |
1043 | # endif // Q_OS_QNX |
1044 | # if (defined(Q_CC_CLANG) || defined(Q_CC_INTEL)) && defined(Q_OS_MAC) && defined(__GNUC_LIBSTD__) \ |
1045 | && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402) |
1046 | // Apple has not updated libstdc++ since 2007, which means it does not have |
1047 | // <initializer_list> or std::move. Let's disable these features |
1048 | # undef Q_COMPILER_INITIALIZER_LISTS |
1049 | # undef Q_COMPILER_RVALUE_REFS |
1050 | # undef Q_COMPILER_REF_QUALIFIERS |
1051 | // Also disable <atomic>, since it's clearly not there |
1052 | # undef Q_COMPILER_ATOMICS |
1053 | # endif |
1054 | # if defined(Q_CC_CLANG) && defined(Q_CC_INTEL) && Q_CC_INTEL >= 1500 |
1055 | // ICC 15.x and 16.0 have their own implementation of std::atomic, which is activated when in Clang mode |
1056 | // (probably because libc++'s <atomic> on OS X failed to compile), but they're missing some |
1057 | // critical definitions. (Reported as Intel Issue ID 6000117277) |
1058 | # define __USE_CONSTEXPR 1 |
1059 | # define __USE_NOEXCEPT 1 |
1060 | # endif |
1061 | # if defined(Q_COMPILER_THREADSAFE_STATICS) && defined(Q_OS_MAC) |
1062 | // Apple's low-level implementation of the C++ support library |
1063 | // (libc++abi.dylib, shared between libstdc++ and libc++) has deadlocks. The |
1064 | // C++11 standard requires the deadlocks to be removed, so this will eventually |
1065 | // be fixed; for now, let's disable this. |
1066 | # undef Q_COMPILER_THREADSAFE_STATICS |
1067 | # endif |
1068 | #endif |
1069 | |
1070 | /* |
1071 | * C++11 keywords and expressions |
1072 | */ |
1073 | #ifdef Q_COMPILER_NULLPTR |
1074 | # define Q_NULLPTR nullptr |
1075 | #else |
1076 | # define Q_NULLPTR NULL |
1077 | #endif |
1078 | |
1079 | #ifdef Q_COMPILER_DEFAULT_MEMBERS |
1080 | # define Q_DECL_EQ_DEFAULT = default |
1081 | #else |
1082 | # define Q_DECL_EQ_DEFAULT |
1083 | #endif |
1084 | |
1085 | #ifdef Q_COMPILER_DELETE_MEMBERS |
1086 | # define Q_DECL_EQ_DELETE = delete |
1087 | #else |
1088 | # define Q_DECL_EQ_DELETE |
1089 | #endif |
1090 | |
1091 | // Don't break code that is already using Q_COMPILER_DEFAULT_DELETE_MEMBERS |
1092 | #if defined(Q_COMPILER_DEFAULT_MEMBERS) && defined(Q_COMPILER_DELETE_MEMBERS) |
1093 | # define Q_COMPILER_DEFAULT_DELETE_MEMBERS |
1094 | #endif |
1095 | |
1096 | #if defined Q_COMPILER_CONSTEXPR |
1097 | # if defined(__cpp_constexpr) && __cpp_constexpr-0 >= 201304 |
1098 | # define Q_DECL_CONSTEXPR constexpr |
1099 | # define Q_DECL_RELAXED_CONSTEXPR constexpr |
1100 | # define Q_CONSTEXPR constexpr |
1101 | # define Q_RELAXED_CONSTEXPR constexpr |
1102 | # else |
1103 | # define Q_DECL_CONSTEXPR constexpr |
1104 | # define Q_DECL_RELAXED_CONSTEXPR |
1105 | # define Q_CONSTEXPR constexpr |
1106 | # define Q_RELAXED_CONSTEXPR const |
1107 | # endif |
1108 | #else |
1109 | # define Q_DECL_CONSTEXPR |
1110 | # define Q_DECL_RELAXED_CONSTEXPR |
1111 | # define Q_CONSTEXPR const |
1112 | # define Q_RELAXED_CONSTEXPR const |
1113 | #endif |
1114 | |
1115 | #ifdef Q_COMPILER_EXPLICIT_OVERRIDES |
1116 | # define Q_DECL_OVERRIDE override |
1117 | # define Q_DECL_FINAL final |
1118 | #else |
1119 | # ifndef Q_DECL_OVERRIDE |
1120 | # define Q_DECL_OVERRIDE |
1121 | # endif |
1122 | # ifndef Q_DECL_FINAL |
1123 | # define Q_DECL_FINAL |
1124 | # endif |
1125 | #endif |
1126 | |
1127 | #ifdef Q_COMPILER_NOEXCEPT |
1128 | # define Q_DECL_NOEXCEPT noexcept |
1129 | # define Q_DECL_NOEXCEPT_EXPR(x) noexcept(x) |
1130 | #else |
1131 | # define Q_DECL_NOEXCEPT |
1132 | # define Q_DECL_NOEXCEPT_EXPR(x) |
1133 | #endif |
1134 | #define Q_DECL_NOTHROW Q_DECL_NOEXCEPT |
1135 | |
1136 | #if defined(Q_COMPILER_ALIGNOF) |
1137 | # undef Q_ALIGNOF |
1138 | # define Q_ALIGNOF(x) alignof(x) |
1139 | #endif |
1140 | |
1141 | #if defined(Q_COMPILER_ALIGNAS) |
1142 | # undef Q_DECL_ALIGN |
1143 | # define Q_DECL_ALIGN(n) alignas(n) |
1144 | #endif |
1145 | |
1146 | #if __has_cpp_attribute(nodiscard) && !defined(Q_CC_CLANG) // P0188R1 |
1147 | // Can't use [[nodiscard]] with Clang, see https://bugs.llvm.org/show_bug.cgi?id=33518 |
1148 | # undef Q_REQUIRED_RESULT |
1149 | # define Q_REQUIRED_RESULT [[nodiscard]] |
1150 | #endif |
1151 | |
1152 | #if defined(__cpp_enumerator_attributes) && __cpp_enumerator_attributes >= 201411 |
1153 | #if defined(Q_CC_MSVC) |
1154 | // Can't mark enum values as __declspec(deprecated) with MSVC, also can't move |
1155 | // everything to [[deprecated]] because MSVC gives a compilation error when marking |
1156 | // friend methods of a class as [[deprecated("text")]], breaking qstring.h |
1157 | # define Q_DECL_ENUMERATOR_DEPRECATED [[deprecated]] |
1158 | # define Q_DECL_ENUMERATOR_DEPRECATED_X(x) [[deprecated(x)]] |
1159 | #else |
1160 | # define Q_DECL_ENUMERATOR_DEPRECATED Q_DECL_DEPRECATED |
1161 | # define Q_DECL_ENUMERATOR_DEPRECATED_X(x) Q_DECL_DEPRECATED_X(x) |
1162 | #endif |
1163 | #endif |
1164 | |
1165 | /* |
1166 | * Fallback macros to certain compiler features |
1167 | */ |
1168 | |
1169 | #ifndef Q_NORETURN |
1170 | # define Q_NORETURN |
1171 | #endif |
1172 | #ifndef Q_LIKELY |
1173 | # define Q_LIKELY(x) (x) |
1174 | #endif |
1175 | #ifndef Q_UNLIKELY |
1176 | # define Q_UNLIKELY(x) (x) |
1177 | #endif |
1178 | #ifndef Q_ASSUME_IMPL |
1179 | # define Q_ASSUME_IMPL(expr) qt_noop() |
1180 | #endif |
1181 | #ifndef Q_UNREACHABLE_IMPL |
1182 | # define Q_UNREACHABLE_IMPL() qt_noop() |
1183 | #endif |
1184 | #ifndef Q_ALLOC_SIZE |
1185 | # define Q_ALLOC_SIZE(x) |
1186 | #endif |
1187 | #ifndef Q_REQUIRED_RESULT |
1188 | # define Q_REQUIRED_RESULT |
1189 | #endif |
1190 | #ifndef Q_DECL_DEPRECATED |
1191 | # define Q_DECL_DEPRECATED |
1192 | #endif |
1193 | #ifndef Q_DECL_VARIABLE_DEPRECATED |
1194 | # define Q_DECL_VARIABLE_DEPRECATED Q_DECL_DEPRECATED |
1195 | #endif |
1196 | #ifndef Q_DECL_DEPRECATED_X |
1197 | # define Q_DECL_DEPRECATED_X(text) Q_DECL_DEPRECATED |
1198 | #endif |
1199 | #ifndef Q_DECL_ENUMERATOR_DEPRECATED |
1200 | # define Q_DECL_ENUMERATOR_DEPRECATED |
1201 | #endif |
1202 | #ifndef Q_DECL_ENUMERATOR_DEPRECATED_X |
1203 | # define Q_DECL_ENUMERATOR_DEPRECATED_X(x) |
1204 | #endif |
1205 | #ifndef Q_DECL_EXPORT |
1206 | # define Q_DECL_EXPORT |
1207 | #endif |
1208 | #ifndef Q_DECL_IMPORT |
1209 | # define Q_DECL_IMPORT |
1210 | #endif |
1211 | #ifndef Q_DECL_HIDDEN |
1212 | # define Q_DECL_HIDDEN |
1213 | #endif |
1214 | #ifndef Q_DECL_UNUSED |
1215 | # define Q_DECL_UNUSED |
1216 | #endif |
1217 | #ifndef Q_DECL_UNUSED_MEMBER |
1218 | # define Q_DECL_UNUSED_MEMBER |
1219 | #endif |
1220 | #ifndef Q_FUNC_INFO |
1221 | # if defined(Q_OS_SOLARIS) || defined(Q_CC_XLC) |
1222 | # define Q_FUNC_INFO __FILE__ "(line number unavailable)" |
1223 | # else |
1224 | # define Q_FUNC_INFO __FILE__ ":" QT_STRINGIFY(__LINE__) |
1225 | # endif |
1226 | #endif |
1227 | #ifndef Q_DECL_CF_RETURNS_RETAINED |
1228 | # define Q_DECL_CF_RETURNS_RETAINED |
1229 | #endif |
1230 | #ifndef Q_DECL_NS_RETURNS_AUTORELEASED |
1231 | # define Q_DECL_NS_RETURNS_AUTORELEASED |
1232 | #endif |
1233 | #ifndef Q_DECL_PURE_FUNCTION |
1234 | # define Q_DECL_PURE_FUNCTION |
1235 | #endif |
1236 | #ifndef Q_DECL_CONST_FUNCTION |
1237 | # define Q_DECL_CONST_FUNCTION Q_DECL_PURE_FUNCTION |
1238 | #endif |
1239 | #ifndef Q_DECL_COLD_FUNCTION |
1240 | # define Q_DECL_COLD_FUNCTION |
1241 | #endif |
1242 | #ifndef QT_MAKE_UNCHECKED_ARRAY_ITERATOR |
1243 | # define QT_MAKE_UNCHECKED_ARRAY_ITERATOR(x) (x) |
1244 | #endif |
1245 | #ifndef QT_MAKE_CHECKED_ARRAY_ITERATOR |
1246 | # define QT_MAKE_CHECKED_ARRAY_ITERATOR(x, N) (x) |
1247 | #endif |
1248 | |
1249 | /* |
1250 | * "Weak overloads" - makes an otherwise confliciting overload weaker |
1251 | * (by making it a template) |
1252 | */ |
1253 | #define Q_WEAK_OVERLOAD template <typename = void> |
1254 | |
1255 | /* |
1256 | * Warning/diagnostic handling |
1257 | */ |
1258 | |
1259 | #define QT_DO_PRAGMA(text) _Pragma(#text) |
1260 | #if defined(Q_CC_INTEL) && defined(Q_CC_MSVC) |
1261 | /* icl.exe: Intel compiler on Windows */ |
1262 | # undef QT_DO_PRAGMA /* not needed */ |
1263 | # define QT_WARNING_PUSH __pragma(warning(push)) |
1264 | # define QT_WARNING_POP __pragma(warning(pop)) |
1265 | # define QT_WARNING_DISABLE_MSVC(number) |
1266 | # define QT_WARNING_DISABLE_INTEL(number) __pragma(warning(disable: number)) |
1267 | # define QT_WARNING_DISABLE_CLANG(text) |
1268 | # define QT_WARNING_DISABLE_GCC(text) |
1269 | # define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1478 1786) |
1270 | #elif defined(Q_CC_INTEL) |
1271 | /* icc: Intel compiler on Linux or OS X */ |
1272 | # define QT_WARNING_PUSH QT_DO_PRAGMA(warning(push)) |
1273 | # define QT_WARNING_POP QT_DO_PRAGMA(warning(pop)) |
1274 | # define QT_WARNING_DISABLE_INTEL(number) QT_DO_PRAGMA(warning(disable: number)) |
1275 | # define QT_WARNING_DISABLE_MSVC(number) |
1276 | # define QT_WARNING_DISABLE_CLANG(text) |
1277 | # define QT_WARNING_DISABLE_GCC(text) |
1278 | # define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_INTEL(1478 1786) |
1279 | #elif defined(Q_CC_MSVC) && !defined(Q_CC_CLANG) |
1280 | # undef QT_DO_PRAGMA /* not needed */ |
1281 | # define QT_WARNING_PUSH __pragma(warning(push)) |
1282 | # define QT_WARNING_POP __pragma(warning(pop)) |
1283 | # define QT_WARNING_DISABLE_MSVC(number) __pragma(warning(disable: number)) |
1284 | # define QT_WARNING_DISABLE_INTEL(number) |
1285 | # define QT_WARNING_DISABLE_CLANG(text) |
1286 | # define QT_WARNING_DISABLE_GCC(text) |
1287 | # define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_MSVC(4996) |
1288 | #elif defined(Q_CC_CLANG) |
1289 | # define QT_WARNING_PUSH QT_DO_PRAGMA(clang diagnostic push) |
1290 | # define QT_WARNING_POP QT_DO_PRAGMA(clang diagnostic pop) |
1291 | # define QT_WARNING_DISABLE_CLANG(text) QT_DO_PRAGMA(clang diagnostic ignored text) |
1292 | # define QT_WARNING_DISABLE_GCC(text) |
1293 | # define QT_WARNING_DISABLE_INTEL(number) |
1294 | # define QT_WARNING_DISABLE_MSVC(number) |
1295 | # define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_CLANG("-Wdeprecated-declarations") |
1296 | #elif defined(Q_CC_GNU) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406) |
1297 | # define QT_WARNING_PUSH QT_DO_PRAGMA(GCC diagnostic push) |
1298 | # define QT_WARNING_POP QT_DO_PRAGMA(GCC diagnostic pop) |
1299 | # define QT_WARNING_DISABLE_GCC(text) QT_DO_PRAGMA(GCC diagnostic ignored text) |
1300 | # define QT_WARNING_DISABLE_CLANG(text) |
1301 | # define QT_WARNING_DISABLE_INTEL(number) |
1302 | # define QT_WARNING_DISABLE_MSVC(number) |
1303 | # define QT_WARNING_DISABLE_DEPRECATED QT_WARNING_DISABLE_GCC("-Wdeprecated-declarations") |
1304 | #else // All other compilers, GCC < 4.6 and MSVC < 2008 |
1305 | # define QT_WARNING_DISABLE_GCC(text) |
1306 | # define QT_WARNING_PUSH |
1307 | # define QT_WARNING_POP |
1308 | # define QT_WARNING_DISABLE_INTEL(number) |
1309 | # define QT_WARNING_DISABLE_MSVC(number) |
1310 | # define QT_WARNING_DISABLE_CLANG(text) |
1311 | # define QT_WARNING_DISABLE_GCC(text) |
1312 | # define QT_WARNING_DISABLE_DEPRECATED |
1313 | #endif |
1314 | |
1315 | #ifndef QT_IGNORE_DEPRECATIONS |
1316 | #define QT_IGNORE_DEPRECATIONS(statement) \ |
1317 | QT_WARNING_PUSH \ |
1318 | QT_WARNING_DISABLE_DEPRECATED \ |
1319 | statement \ |
1320 | QT_WARNING_POP |
1321 | #endif |
1322 | |
1323 | /* |
1324 | Proper for-scoping in MIPSpro CC |
1325 | */ |
1326 | #ifndef QT_NO_KEYWORDS |
1327 | # if defined(Q_CC_MIPS) || (defined(Q_CC_HPACC) && defined(__ia64)) |
1328 | # define for if (0) {} else for |
1329 | # endif |
1330 | #endif |
1331 | |
1332 | #ifdef Q_COMPILER_RVALUE_REFS |
1333 | #define qMove(x) std::move(x) |
1334 | #else |
1335 | #define qMove(x) (x) |
1336 | #endif |
1337 | |
1338 | #define Q_UNREACHABLE() \ |
1339 | do {\ |
1340 | Q_ASSERT_X(false, "Q_UNREACHABLE()", "Q_UNREACHABLE was reached");\ |
1341 | Q_UNREACHABLE_IMPL();\ |
1342 | } while (false) |
1343 | |
1344 | #define Q_ASSUME(Expr) \ |
1345 | do {\ |
1346 | const bool valueOfExpression = Expr;\ |
1347 | Q_ASSERT_X(valueOfExpression, "Q_ASSUME()", "Assumption in Q_ASSUME(\"" #Expr "\") was not correct");\ |
1348 | Q_ASSUME_IMPL(valueOfExpression);\ |
1349 | } while (false) |
1350 | |
1351 | #if defined(__cplusplus) |
1352 | #if __has_cpp_attribute(clang::fallthrough) |
1353 | # define Q_FALLTHROUGH() [[clang::fallthrough]] |
1354 | #elif __has_cpp_attribute(gnu::fallthrough) |
1355 | # define Q_FALLTHROUGH() [[gnu::fallthrough]] |
1356 | #elif __has_cpp_attribute(fallthrough) |
1357 | # define Q_FALLTHROUGH() [[fallthrough]] |
1358 | #endif |
1359 | #endif |
1360 | #ifndef Q_FALLTHROUGH |
1361 | # if (defined(Q_CC_GNU) && Q_CC_GNU >= 700) && !defined(Q_CC_INTEL) |
1362 | # define Q_FALLTHROUGH() __attribute__((fallthrough)) |
1363 | # else |
1364 | # define Q_FALLTHROUGH() (void)0 |
1365 | #endif |
1366 | #endif |
1367 | |
1368 | |
1369 | /* |
1370 | Sanitize compiler feature availability |
1371 | */ |
1372 | #if !defined(Q_PROCESSOR_X86) |
1373 | # undef QT_COMPILER_SUPPORTS_SSE2 |
1374 | # undef QT_COMPILER_SUPPORTS_SSE3 |
1375 | # undef QT_COMPILER_SUPPORTS_SSSE3 |
1376 | # undef QT_COMPILER_SUPPORTS_SSE4_1 |
1377 | # undef QT_COMPILER_SUPPORTS_SSE4_2 |
1378 | # undef QT_COMPILER_SUPPORTS_AVX |
1379 | # undef QT_COMPILER_SUPPORTS_AVX2 |
1380 | # undef QT_COMPILER_SUPPORTS_F16C |
1381 | #endif |
1382 | #if !defined(Q_PROCESSOR_ARM) |
1383 | # undef QT_COMPILER_SUPPORTS_NEON |
1384 | #endif |
1385 | #if !defined(Q_PROCESSOR_MIPS) |
1386 | # undef QT_COMPILER_SUPPORTS_MIPS_DSP |
1387 | # undef QT_COMPILER_SUPPORTS_MIPS_DSPR2 |
1388 | #endif |
1389 | |
1390 | #endif // QCOMPILERDETECTION_H |
1391 | |