Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qcompilerdetection.h
Go to the documentation of this file.
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
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
QT_WARNING_DISABLE_MSVC
#define QT_WARNING_DISABLE_MSVC(number)
Definition
qcompilerdetection.h:1171
qtbase
src
corelib
global
qcompilerdetection.h
Generated by
1.10.0