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