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