iutest  1.17.99.14
iutest_compiler.hpp
[詳解]
1 //======================================================================
2 //-----------------------------------------------------------------------
13 //-----------------------------------------------------------------------
14 //======================================================================
15 #ifndef INCG_IRIS_IUTEST_COMPILER_HPP_6DDB27E8_E2FF_4754_80B0_F500025820C4_
16 #define INCG_IRIS_IUTEST_COMPILER_HPP_6DDB27E8_E2FF_4754_80B0_F500025820C4_
17 
18 //======================================================================
19 // include
20 #include "iutest_platform.hpp"
21 
22 //======================================================================
23 // define
24 #if defined(_MSC_VER) && _MSC_VER == 1700
25 # ifndef _VARIADIC_MAX
26 # define _VARIADIC_MAX 10
27 # endif
28 #endif
29 
30 // for clang
31 #if defined(__clang__)
32 # if !defined(IUTEST_CLANG_MAJOR)
33 # if defined(__APPLE__)
34 # if __clang_major__ > 11
35 # define IUTEST_CLANG_MAJOR 10
36 # elif __clang_major__ > 10
37 # if __clang_minor__ > 3
38 # define IUTEST_CLANG_MAJOR 9
39 # else
40 # define IUTEST_CLANG_MAJOR 8
41 # endif
42 # elif __clang_major__ > 9
43 # if __clang_minor__ > 1
44 # define IUTEST_CLANG_MAJOR 7
45 # else
46 # define IUTEST_CLANG_MAJOR 6
47 # endif
48 # elif __clang_major__ > 8
49 # if __clang_minor__ > 2
50 # define IUTEST_CLANG_MAJOR 5
51 # else
52 # define IUTEST_CLANG_MAJOR 4
53 # endif
54 # else
55 # define IUTEST_CLANG_MAJOR 3
56 # if __clang_major__ > 7
57 # define IUTEST_CLANG_MINOR 9
58 # elif __clang_major__ > 6
59 # if __clang_minor__ > 2
60 # define IUTEST_CLANG_MINOR 8
61 # else
62 # define IUTEST_CLANG_MINOR 7
63 # endif
64 # else
65 # define IUTEST_CLANG_MINOR __clang_major__
66 # endif
67 # endif
68 # else
69 # define IUTEST_CLANG_MAJOR __clang_major__
70 # endif
71 # endif
72 # if !defined(IUTEST_CLANG_MINOR)
73 # define IUTEST_CLANG_MINOR __clang_minor__
74 # endif
75 #endif
76 
77 // __cplusplus numbers
78 #define IUTEST_CPLUSPLUS_CXX11 201103L
79 #define IUTEST_CPLUSPLUS_CXX14 201402L
80 #define IUTEST_CPLUSPLUS_CXX17 201703L
81 #define IUTEST_CPLUSPLUS_CXX20 202002L
82 
83 // __cplusplus
84 #if defined(_MSVC_LANG)
85 # define IUTEST_CPLUSPLUS _MSVC_LANG
86 #elif defined(__cplusplus)
87 # define IUTEST_CPLUSPLUS __cplusplus
88 #else
89 # define IUTEST_CPLUSPLUS 0
90 #endif
91 
92 // c++2a
93 
94 #if !defined(IUTEST_HAS_CXX2B)
95 # if IUTEST_CPLUSPLUS > IUTEST_CPLUSPLUS_CXX20
96 # define IUTEST_HAS_CXX2B 1
97 # endif
98 #endif
99 
100 #if !defined(IUTEST_HAS_CXX2B)
101 # define IUTEST_HAS_CXX2B 0
102 #endif
103 
104 // c++20
105 
106 #if !defined(IUTEST_HAS_CXX20)
107 # if IUTEST_CPLUSPLUS >= IUTEST_CPLUSPLUS_CXX20
108 # define IUTEST_HAS_CXX20 1
109 # endif
110 #endif
111 
112 #if !defined(IUTEST_HAS_CXX20)
113 # define IUTEST_HAS_CXX20 0
114 #endif
115 
116 // c++2a
117 
118 #if !defined(IUTEST_HAS_CXX2A)
119 # if IUTEST_CPLUSPLUS > IUTEST_CPLUSPLUS_CXX17
120 # define IUTEST_HAS_CXX2A 1
121 # endif
122 #endif
123 
124 #if !defined(IUTEST_HAS_CXX2A)
125 # define IUTEST_HAS_CXX2A 0
126 #endif
127 
128 // c++17
130 #if !defined(IUTEST_HAS_CXX17)
131 # if IUTEST_CPLUSPLUS >= IUTEST_CPLUSPLUS_CXX17
132 # define IUTEST_HAS_CXX17 1
133 # endif
134 #endif
135 
136 #if !defined(IUTEST_HAS_CXX17)
137 # define IUTEST_HAS_CXX17 0
138 #endif
139 
140 #if !defined(IUTEST_HAS_CXX1Z)
141 # if IUTEST_CPLUSPLUS > IUTEST_CPLUSPLUS_CXX14
142 # define IUTEST_HAS_CXX1Z 1
143 # endif
144 #endif
145 
146 #if !defined(IUTEST_HAS_CXX1Z)
147 # define IUTEST_HAS_CXX1Z 0
148 #endif
149 
151 #if !defined(IUTEST_HAS_CXX14)
152 # if IUTEST_CPLUSPLUS >= IUTEST_CPLUSPLUS_CXX14
153 # define IUTEST_HAS_CXX14 1
154 # endif
155 #endif
156 
157 #if !defined(IUTEST_HAS_CXX14)
158 # define IUTEST_HAS_CXX14 0
159 #endif
160 
162 #if !defined(IUTEST_HAS_CXX11)
163 # if (IUTEST_CPLUSPLUS >= IUTEST_CPLUSPLUS_CXX11) || defined(__GXX_EXPERIMENTAL_CXX0X__)
164 # define IUTEST_HAS_CXX11 1
165 # endif
166 #endif
167 
168 #if !defined(IUTEST_HAS_CXX11)
169 # define IUTEST_HAS_CXX11 0
170 #endif
171 
172 
173 // c++20 features
174 
176 #if !defined(IUTEST_HAS_CONCEPTS)
177 # if defined(__cpp_concepts) && __cpp_concepts >= 201907
178 # define IUTEST_HAS_CONCEPTS 1
179 # elif IUTEST_HAS_CXX2A && defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 192328105
180 # define IUTEST_HAS_CONCEPTS 1
181 # endif
182 #endif
183 
184 #if !defined(IUTEST_HAS_CONCEPTS)
185 # define IUTEST_HAS_CONCEPTS 0
186 #endif
187 
188 // c++17 features
189 
191 #if !defined(IUTEST_HAS_INLINE_VARIABLE)
192 #if defined(__cpp_inline_variables) && __cpp_inline_variables >= 201606
193 # define IUTEST_HAS_INLINE_VARIABLE 1
194 #elif defined(__clang__)
195 # if IUTEST_HAS_CXX1Z && (IUTEST_CLANG_MAJOR > 3 || (IUTEST_CLANG_MAJOR == 3 && IUTEST_CLANG_MINOR >= 9))
196 # define IUTEST_HAS_INLINE_VARIABLE 1
197 # endif
198 #endif
199 #endif
200 
201 #if !defined(IUTEST_HAS_INLINE_VARIABLE)
202 # define IUTEST_HAS_INLINE_VARIABLE 0
203 #endif
204 
206 #if !defined(IUTEST_HAS_CONSTEXPR_IF)
207 # if defined(__cpp_if_constexpr) && __cpp_if_constexpr >= 201606
208 # define IUTEST_HAS_CONSTEXPR_IF 1
209 # elif defined(_MSC_VER)
210 # if _MSC_VER >= 1910 && IUTEST_HAS_CXX17
211 # define IUTEST_HAS_CONSTEXPR_IF 1
212 # endif
213 # endif
214 #endif
215 
216 #if !defined(IUTEST_HAS_CONSTEXPR_IF)
217 # define IUTEST_HAS_CONSTEXPR_IF 0
218 #endif
219 
220 // c++11 features
221 
223 #if !defined(IUTEST_HAS_NULLPTR)
224 # if defined(_NATIVE_NULLPTR_SUPPORTED)
225 # define IUTEST_HAS_NULLPTR 1
226 # elif defined(__clang__)
227 # if __has_feature(cxx_nullptr)
228 # define IUTEST_HAS_NULLPTR 1
229 # endif
230 # if (IUTEST_CLANG_MAJOR < 3 || (IUTEST_CLANG_MAJOR == 3 && IUTEST_CLANG_MINOR <= 2))
231 # define IUTEST_NO_NULL_TO_NULLPTR_T 1 // -Wnull-conversion
232 # endif
233 # elif defined(__INTEL_COMPILER)
234 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER > 1200
235 # define IUTEST_HAS_NULLPTR 1
236 # endif
237 # elif defined(__GNUC__)
238 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
239 # define IUTEST_HAS_NULLPTR 1
240 # endif
241 # elif defined(_MSC_VER)
242 # if _MSC_VER > 1500
243 # define IUTEST_HAS_NULLPTR 1
244 # endif
245 # endif
246 #endif
247 
248 #if !defined(IUTEST_HAS_NULLPTR)
249 # define IUTEST_HAS_NULLPTR 0
250 #endif
251 
252 #if !defined(IUTEST_NULLPTR)
253 # if IUTEST_HAS_NULLPTR
254 # define IUTEST_NULLPTR nullptr
255 # else
256 # define IUTEST_NULLPTR NULL
257 # endif
258 #endif
259 
261 #if !defined(IUTEST_HAS_AUTO)
262 # if defined(__clang__)
263 # if __has_feature(cxx_auto_type)
264 # define IUTEST_HAS_AUTO 1
265 # endif
266 # elif defined(__INTEL_COMPILER)
267 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1200
268 # define IUTEST_HAS_AUTO 1
269 # endif
270 # elif defined(__GNUC__)
271 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
272 # define IUTEST_HAS_AUTO 1
273 # endif
274 # elif defined(_MSC_VER)
275 # if _MSC_VER >= 1600
276 # define IUTEST_HAS_AUTO 1
277 # endif
278 # endif
279 #endif
280 
281 #if !defined(IUTEST_HAS_AUTO)
282 # define IUTEST_HAS_AUTO 0
283 #endif
284 
286 #if !defined(IUTEST_HAS_DECLTYPE)
287 # if defined(__cpp_decltype) && __cpp_decltype >= 200707
288 # define IUTEST_HAS_DECLTYPE 1
289 # elif defined(__clang__)
290 # if __has_feature(cxx_decltype)
291 # define IUTEST_HAS_DECLTYPE 1
292 # endif
293 # elif defined(__INTEL_COMPILER)
294 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1200
295 # define IUTEST_HAS_DECLTYPE 1
296 # endif
297 # elif defined(__GNUC__)
298 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
299 # define IUTEST_HAS_DECLTYPE 1
300 # endif
301 # elif defined(_MSC_VER)
302 # if _MSC_VER >= 1600
303 # define IUTEST_HAS_DECLTYPE 1
304 # endif
305 # endif
306 #endif
307 
308 #if !defined(IUTEST_HAS_DECLTYPE)
309 # define IUTEST_HAS_DECLTYPE 0
310 #endif
311 
313 #if !defined(IUTEST_HAS_STATIC_ASSERT)
314 # if defined(__cpp_static_assert) && __cpp_static_assert >= 200410
315 # define IUTEST_HAS_STATIC_ASSERT 1
316 # elif defined(__clang__)
317 # if __has_feature(cxx_static_assert)
318 # define IUTEST_HAS_STATIC_ASSERT 1
319 # endif
320 # elif defined(__INTEL_COMPILER)
321 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER > 1100
322 # define IUTEST_HAS_STATIC_ASSERT 1
323 # endif
324 # elif defined(__GNUC__)
325 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
326 # define IUTEST_HAS_STATIC_ASSERT 1
327 # endif
328 # elif defined(_MSC_VER)
329 # if _MSC_VER >= 1600
330 # define IUTEST_HAS_STATIC_ASSERT 1
331 # endif
332 # endif
333 #endif
334 
335 #if !defined(IUTEST_HAS_STATIC_ASSERT)
336 # define IUTEST_HAS_STATIC_ASSERT 0
337 #endif
338 
339 
341 #if !defined(IUTEST_HAS_CONSTEXPR)
342 # if defined(__cpp_constexpr) && __cpp_constexpr >= 200704
343 # define IUTEST_HAS_CONSTEXPR 1
344 # elif defined(__clang__)
345 # if __has_feature(cxx_constexpr)
346 # define IUTEST_HAS_CONSTEXPR 1
347 # endif
348 # elif defined(__INTEL_COMPILER)
349 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1400
350 # define IUTEST_HAS_CONSTEXPR 1
351 # endif
352 # elif defined(__GNUC__)
353 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
354 # define IUTEST_HAS_CONSTEXPR 1
355 # endif
356 # elif defined(_MSC_VER)
357 # if _MSC_VER >= 1900 || _MSC_FULL_VER == 180021114
358 # define IUTEST_HAS_CONSTEXPR 1
359 # endif
360 # endif
361 #endif
362 
363 #if !defined(IUTEST_HAS_CONSTEXPR)
364 # define IUTEST_HAS_CONSTEXPR 0
365 #endif
366 
368 #if IUTEST_HAS_CONSTEXPR
369 # define IUTEST_CXX_CONSTEXPR constexpr
370 #else
371 # define IUTEST_CXX_CONSTEXPR
372 #endif
373 
374 #if IUTEST_HAS_CONSTEXPR && \
375  (defined(__cpp_constexpr) && __cpp_constexpr >= 201304 || IUTEST_HAS_CXX14)
376 # define IUTEST_CXX14_CONSTEXPR constexpr
377 #else
378 # define IUTEST_CXX14_CONSTEXPR
379 #endif
380 
382 #if IUTEST_HAS_CONSTEXPR
383 # define IUTEST_CXX_CONSTEXPR_OR_CONST constexpr
384 #else
385 # define IUTEST_CXX_CONSTEXPR_OR_CONST const
386 #endif
387 
389 #if !defined(IUTEST_HAS_RVALUE_REFS)
390 # if defined(__cpp_rvalue_references) && __cpp_rvalue_references >= 200610
391 # define IUTEST_HAS_RVALUE_REFS 1
392 # elif defined(__clang__)
393 # if __has_feature(cxx_rvalue_references)
394 # define IUTEST_HAS_RVALUE_REFS 1
395 # endif
396 # elif defined(__INTEL_COMPILER)
397 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1200
398 # define IUTEST_HAS_RVALUE_REFS 1
399 # endif
400 # elif defined(__GNUC__)
401 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
402 # define IUTEST_HAS_RVALUE_REFS 1
403 # endif
404 # elif defined(_MSC_VER)
405 # if (_MSC_VER >= 1700)
406 # define IUTEST_HAS_RVALUE_REFS 1
407 # endif
408 # endif
409 #endif
410 
411 #if !defined(IUTEST_HAS_RVALUE_REFS)
412 # define IUTEST_HAS_RVALUE_REFS 0
413 #endif
414 
416 #ifndef IUTEST_HAS_DELETED_FUNCTIONS
417 # if defined(__clang__)
418 # if __has_feature(cxx_deleted_functions)
419 # define IUTEST_HAS_DELETED_FUNCTIONS 1
420 # endif
421 # elif defined(__INTEL_COMPILER)
422 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1200
423 # define IUTEST_HAS_DELETED_FUNCTIONS 1
424 # endif
425 # elif defined(__GNUC__)
426 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
427 # define IUTEST_HAS_DELETED_FUNCTIONS 1
428 # endif
429 # elif defined(_MSC_VER)
430 # if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 180020827)
431 # define IUTEST_HAS_DELETED_FUNCTIONS 1
432 # endif
433 # endif
434 #endif
435 
436 #if !defined(IUTEST_HAS_DELETED_FUNCTIONS)
437 # define IUTEST_HAS_DELETED_FUNCTIONS 0
438 #endif
439 
441 #if IUTEST_HAS_DELETED_FUNCTIONS
442 # define IUTEST_CXX_DELETED_FUNCTION = delete
443 #else
444 # define IUTEST_CXX_DELETED_FUNCTION
445 #endif
446 
447 #if !defined(IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION) && !IUTEST_HAS_RVALUE_REFS
448 # define IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION 0
449 #endif
450 
452 #if !defined(IUTEST_HAS_DEFAULT_FUNCTIONS)
453 # if defined(__clang__)
454 # if __has_feature(cxx_defaulted_functions)
455 # define IUTEST_HAS_DEFAULT_FUNCTIONS 1
456 # endif
457 # elif defined(__INTEL_COMPILER)
458 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1200
459 # define IUTEST_HAS_DEFAULT_FUNCTIONS 1
460 # endif
461 # elif defined(__GNUC__)
462 // move assignment operator = default is not works in gcc 4.4
463 // private destractor = default is not works in gcc 4.5 - 4.6
464 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 4)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
465 # define IUTEST_HAS_DEFAULT_FUNCTIONS 1
466 # if !defined(IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION)
467 # define IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION 0
468 # endif
469 # elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
470 # define IUTEST_HAS_DEFAULT_FUNCTIONS 1
471 # endif
472 # elif defined(_MSC_VER)
473 # if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 180020827)
474 # define IUTEST_HAS_DEFAULT_FUNCTIONS 1
475 # if (_MSV_VER <= 1800) && !defined(IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION)
476 # define IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION 0
477 # endif
478 # endif
479 # endif
480 #endif
481 
482 #if !defined(IUTEST_HAS_DEFAULT_FUNCTIONS)
483 # define IUTEST_HAS_DEFAULT_FUNCTIONS 0
484 #endif
485 #if !defined(IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION)
486 # define IUTEST_HAS_MOVE_ASSIGNMENT_DEFAULT_FUNCTION IUTEST_HAS_DEFAULT_FUNCTIONS
487 #endif
488 
490 #if IUTEST_HAS_DEFAULT_FUNCTIONS
491 # define IUTEST_CXX_DEFAULT_FUNCTION = default;
492 #else
493 # define IUTEST_CXX_DEFAULT_FUNCTION {}
494 #endif
495 
497 #if !defined(IUTEST_HAS_INITIALIZER_LIST)
498 # if defined(__cpp_initializer_lists) && __cpp_initializer_lists >= 200806
499 # define IUTEST_HAS_INITIALIZER_LIST 1
500 # elif defined(__clang__)
501 # if __has_feature(cxx_generalized_initializers)
502 # define IUTEST_HAS_INITIALIZER_LIST 1
503 # endif
504 # elif defined(__INTEL_COMPILER)
505 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1400
506 # define IUTEST_HAS_INITIALIZER_LIST 1
507 # endif
508 # elif defined(__GNUC__)
509 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
510 # define IUTEST_HAS_INITIALIZER_LIST 1
511 # endif
512 # elif defined(_MSC_VER)
513 # if (_MSC_VER >= 1800)
514 # define IUTEST_HAS_INITIALIZER_LIST 1
515 # elif (_MSC_FULL_VER == 170051025)
516 # define IUTEST_HAS_INITIALIZER_LIST 1
517 # endif
518 # endif
519 #endif
520 
521 #if !defined(IUTEST_HAS_INITIALIZER_LIST)
522 # define IUTEST_HAS_INITIALIZER_LIST 0
523 #endif
524 
525 #if IUTEST_HAS_INITIALIZER_LIST
526 # include <initializer_list> // IWYU pragma: export
527 #endif
528 
530 #if !defined(IUTEST_HAS_VARIADIC_TEMPLATES)
531 # if defined(__cpp_variadic_templates) && __cpp_variadic_templates >= 200704
532 # define IUTEST_HAS_VARIADIC_TEMPLATES 1
533 # elif defined(__clang__)
534 # if __has_feature(cxx_variadic_templates)
535 # define IUTEST_HAS_VARIADIC_TEMPLATES 1
536 # endif
537 # elif defined(__INTEL_COMPILER)
538 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER > 1200
539 # define IUTEST_HAS_VARIADIC_TEMPLATES 1
540 # endif
541 # elif defined(__GNUC__)
542 // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=35722
543 # if defined(__VARIADIC_TEMPLATES) \
544  || ( ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))) && defined(__GXX_EXPERIMENTAL_CXX0X__) )
545 # define IUTEST_HAS_VARIADIC_TEMPLATES 1
546 # endif
547 # elif defined(_MSC_VER)
548 # if (_MSC_VER >= 1800)
549 # define IUTEST_HAS_VARIADIC_TEMPLATES 1
550 # elif (_MSC_FULL_VER == 170051025)
551 # define IUTEST_HAS_VARIADIC_TEMPLATES 1
552 # define IUTEST_HAS_VARIADIC_COMBINE 0
553 # endif
554 # endif
555 #endif
556 
557 #if !defined(IUTEST_HAS_VARIADIC_TEMPLATES)
558 # define IUTEST_HAS_VARIADIC_TEMPLATES 0
559 #endif
560 
562 #if !defined(IUTEST_HAS_VARIADIC_TEMPLATE_TEMPLATES)
563 # if defined(__clang__)
564 # if __has_feature(cxx_variadic_templates)
565 # define IUTEST_HAS_VARIADIC_TEMPLATE_TEMPLATES 1
566 # endif
567 # elif defined(__INTEL_COMPILER)
568 # define IUTEST_HAS_VARIADIC_TEMPLATE_TEMPLATES IUTEST_HAS_VARIADIC_TEMPLATES
569 # elif defined(__GNUC__)
570 # if defined(__VARIADIC_TEMPLATES) || ( ((__GNUC__ > 4) \
571  || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) \
572  || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7) && (__GNUC_PATCHLEVEL__ >= 1))) \
573  && defined(__GXX_EXPERIMENTAL_CXX0X__) )
574 # define IUTEST_HAS_VARIADIC_TEMPLATE_TEMPLATES 1
575 # endif
576 # elif defined(_MSC_VER)
577 # define IUTEST_HAS_VARIADIC_TEMPLATE_TEMPLATES IUTEST_HAS_VARIADIC_TEMPLATES
578 # endif
579 #endif
580 
581 #ifndef IUTEST_HAS_VARIADIC_TEMPLATE_TEMPLATES
582 # define IUTEST_HAS_VARIADIC_TEMPLATE_TEMPLATES 0
583 #endif
584 
586 #if !defined(IUTEST_HAS_CHAR16_T)
587 # if defined(__cpp_unicode_characters) && __cpp_unicode_characters >= 200704 && defined(__cpp_unicode_literals) && __cpp_unicode_literals >= 200710
588 # define IUTEST_HAS_CHAR16_T 1
589 # elif defined(__clang__)
590 # if __has_feature(cxx_unicode_literals)
591 # define IUTEST_HAS_CHAR16_T 1
592 # endif
593 # elif defined(__INTEL_COMPILER)
594 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1400
595 # define IUTEST_HAS_CHAR16_T 1
596 # endif
597 # elif defined(__GNUC__)
598 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
599 # define IUTEST_HAS_CHAR16_T 1
600 # endif
601 # elif defined(_MSC_VER)
602 # if _MSC_VER >= 1900
603 # define IUTEST_HAS_CHAR16_T 1
604 # endif
605 # endif
606 #endif
607 
608 #if !defined(IUTEST_HAS_CHAR16_T)
609 # define IUTEST_HAS_CHAR16_T 0
610 #endif
611 
613 #ifndef IUTEST_HAS_CHAR32_T
614 # if defined(__cpp_unicode_characters) && __cpp_unicode_characters >= 200704 && defined(__cpp_unicode_literals) && __cpp_unicode_literals >= 200710
615 # define IUTEST_HAS_CHAR32_T 1
616 # elif defined(__clang__)
617 # if __has_feature(cxx_unicode_literals)
618 # define IUTEST_HAS_CHAR32_T 1
619 # endif
620 # elif defined(__INTEL_COMPILER)
621 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1400
622 # define IUTEST_HAS_CHAR32_T 1
623 # endif
624 # elif defined(__GNUC__)
625 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
626 # define IUTEST_HAS_CHAR32_T 1
627 # endif
628 # elif defined(_MSC_VER)
629 # if _MSC_VER >= 1900
630 # define IUTEST_HAS_CHAR32_T 1
631 # endif
632 # endif
633 #endif
634 
635 #if !defined(IUTEST_HAS_CHAR32_T)
636 # define IUTEST_HAS_CHAR32_T 0
637 #endif
638 
640 #if !defined(IUTEST_HAS_LAMBDA)
641 # if defined(__cpp_lambdas) && __cpp_lambdas >= 200907
642 # define IUTEST_HAS_LAMBDA 1
643 # elif defined(__clang__)
644 # if __has_feature(cxx_lambdas)
645 # define IUTEST_HAS_LAMBDA 1
646 # endif
647 # elif defined(__INTEL_COMPILER)
648 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1200
649 # define IUTEST_HAS_LAMBDA 1
650 # endif
651 # elif defined(__GNUC__)
652 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
653 # define IUTEST_HAS_LAMBDA 1
654 # endif
655 # elif defined(_MSC_VER)
656 # if _MSC_VER > 1800
657 # define IUTEST_HAS_LAMBDA 1
658 # elif _MSC_VER > 1600
659 # define IUTEST_HAS_LAMBDA 1
660 # define IUTEST_NO_LAMBDA_SEH_SCOPE_RESOLUTION // lambda v1.1 is not supported try/__try scope resolution.
661 # elif _MSC_VER == 1600
662 # define IUTEST_HAS_LAMBDA 1
663 # define IUTEST_NO_LAMBDA_SCOPE_RESOLUTION // VC++10 lambda v1.0 is not supported.
664 # endif
665 # endif
666 #endif
667 
668 #if !defined(IUTEST_HAS_LAMBDA)
669 # define IUTEST_HAS_LAMBDA 0
670 #endif
671 
672 #if IUTEST_HAS_LAMBDA
673 # if defined(__GNUC__)
674 # if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7))
675 # define IUTEST_NO_LAMBDA_LOCAL_OBJECT_TEMPLATE_PARAMETERS
676 # endif
677 # elif defined(_MSC_VER)
678 # define IUTEST_NO_LAMBDA_LOCAL_OBJECT_TEMPLATE_PARAMETERS
679 # endif
680 #endif
681 
683 #if !defined(IUTEST_HAS_EXPLICIT_CONVERSION)
684 # if defined(__clang__)
685 # if __has_feature(cxx_explicit_conversions)
686 # define IUTEST_HAS_EXPLICIT_CONVERSION 1
687 # endif
688 # elif defined(__INTEL_COMPILER)
689 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1300
690 # define IUTEST_HAS_EXPLICIT_CONVERSION 1
691 # endif
692 # elif defined(__GNUC__)
693 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
694 # define IUTEST_HAS_EXPLICIT_CONVERSION 1
695 # endif
696 # elif defined(_MSC_VER)
697 # if (_MSC_VER >= 1800) || (_MSC_FULL_VER == 170051025)
698 # define IUTEST_HAS_EXPLICIT_CONVERSION 1
699 # endif
700 # endif
701 #endif
702 
703 #if !defined(IUTEST_HAS_EXPLICIT_CONVERSION)
704 # define IUTEST_HAS_EXPLICIT_CONVERSION 0
705 #endif
706 
708 #if !defined(IUTEST_CXX_EXPLICIT_CONVERSION)
709 # if IUTEST_HAS_EXPLICIT_CONVERSION
710 # define IUTEST_CXX_EXPLICIT_CONVERSION explicit
711 # else
712 # define IUTEST_CXX_EXPLICIT_CONVERSION
713 # endif
714 #endif
715 
717 #if !defined(IUTEST_HAS_OVERRIDE_AND_FINAL)
718 # if defined(__clang__)
719 # if __has_feature(cxx_override_control)
720 # define IUTEST_HAS_OVERRIDE_AND_FINAL 1
721 # endif
722 # elif defined(__INTEL_COMPILER)
723 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1400
724 # define IUTEST_HAS_OVERRIDE_AND_FINAL 1
725 # endif
726 # elif defined(__GNUC__)
727 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
728 # define IUTEST_HAS_OVERRIDE_AND_FINAL 1
729 # endif
730 # elif defined(_MSC_VER)
731 # if _MSC_VER >= 1700
732 # define IUTEST_HAS_OVERRIDE_AND_FINAL 1
733 # endif
734 # endif
735 #endif
736 
737 #if !defined(IUTEST_HAS_OVERRIDE_AND_FINAL)
738 # define IUTEST_HAS_OVERRIDE_AND_FINAL 0
739 #endif
740 
742 #if !defined(IUTEST_CXX_OVERRIDE)
743 # if IUTEST_HAS_OVERRIDE_AND_FINAL
744 # define IUTEST_CXX_OVERRIDE override
745 # else
746 # define IUTEST_CXX_OVERRIDE
747 # endif
748 #endif
749 
751 #if !defined(IUTEST_CXX_FINAL)
752 # if IUTEST_HAS_OVERRIDE_AND_FINAL
753 # define IUTEST_CXX_FINAL final
754 # else
755 # define IUTEST_CXX_FINAL
756 # endif
757 #endif
758 
760 #ifndef IUTEST_HAS_NOEXCEPT
761 # if defined(__clang__)
762 # if __has_feature(cxx_noexcept)
763 # define IUTEST_HAS_NOEXCEPT 1
764 # endif
765 # elif defined(__INTEL_COMPILER)
766 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1400
767 # define IUTEST_HAS_NOEXCEPT 1
768 # endif
769 # elif defined(__GNUC__)
770 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
771 # define IUTEST_HAS_NOEXCEPT 1
772 # endif
773 # elif defined(_MSC_VER)
774 // https://connect.microsoft.com/VisualStudio/feedback/details/809079/torino-compile-error-template-noexcept
775 # if _MSC_FULL_VER >= 190022816
776 # define IUTEST_HAS_NOEXCEPT 1
777 # endif
778 # endif
779 #endif
780 
781 #if !defined(IUTEST_HAS_NOEXCEPT)
782 # define IUTEST_HAS_NOEXCEPT 0
783 #endif
784 
786 #if !defined(IUTEST_HAS_NOEXCEPT_FUNCTION_TYPE)
787 # if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510L
788 # define IUTEST_HAS_NOEXCEPT_FUNCTION_TYPE 1
789 # endif
790 #endif
791 
792 #if !defined(IUTEST_HAS_NOEXCEPT_FUNCTION_TYPE)
793 # define IUTEST_HAS_NOEXCEPT_FUNCTION_TYPE 0
794 #endif
795 
797 #if !defined(IUTEST_CXX_NOEXCEPT)
798 # if IUTEST_HAS_NOEXCEPT
799 # define IUTEST_CXX_NOEXCEPT(expr_) noexcept(expr_)
800 # else
801 # define IUTEST_CXX_NOEXCEPT(expr_)
802 # endif
803 #endif
804 
806 #if !defined(IUTEST_CXX_NOEXCEPT_SPEC)
807 # if IUTEST_HAS_NOEXCEPT
808 # define IUTEST_CXX_NOEXCEPT_SPEC noexcept
809 # else
810 # define IUTEST_CXX_NOEXCEPT_SPEC
811 # endif
812 #endif
813 
814 #if !defined(IUTEST_CXX_NOEXCEPT_AS)
815 # if IUTEST_HAS_NOEXCEPT
816 # define IUTEST_CXX_NOEXCEPT_AS(expr_) noexcept( noexcept(expr_) )
817 # else
818 # define IUTEST_CXX_NOEXCEPT_AS(expr_)
819 # endif
820 #endif
821 
823 #if !defined(IUTEST_CXX_NOTHROW)
824 # if IUTEST_HAS_NOEXCEPT
825 # define IUTEST_CXX_NOTHROW noexcept
826 # elif IUTEST_HAS_CXX2A
827 # define IUTEST_CXX_NOTHROW
828 # else
829 # define IUTEST_CXX_NOTHROW throw() // C++20 で消える
830 # endif
831 #endif
832 
834 #if !defined(IUTEST_HAS_EXTERN_TEMPLATE)
835 # if defined(_MSC_VER) && _MSC_VER >= 1400
836 # define IUTEST_HAS_EXTERN_TEMPLATE 1
837 # elif defined(__INTEL_COMPILER)
838 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER > 1100
839 # define IUTEST_HAS_EXTERN_TEMPLATE 1
840 # endif
841 # elif defined(__GNUC__) || defined(__clang__)
842 # define IUTEST_HAS_EXTERN_TEMPLATE 1
843 # endif
844 #endif
845 
846 #if !defined(IUTEST_HAS_EXTERN_TEMPLATE)
847 # define IUTEST_HAS_EXTERN_TEMPLATE 0
848 #endif
849 
851 #if !defined(IUTEST_HAS_STRONG_ENUMS)
852 # if defined(__clang__)
853 # if __has_feature(cxx_strong_enums)
854 # define IUTEST_HAS_STRONG_ENUMS 1
855 # endif
856 # elif defined(__INTEL_COMPILER)
857 # if IUTEST_HAS_CXX11 && __INTEL_COMPILER >= 1400
858 # define IUTEST_HAS_STRONG_ENUMS 1
859 # endif
860 # elif defined(__GNUC__)
861 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
862 # define IUTEST_HAS_STRONG_ENUMS 1
863 # endif
864 # elif defined(_MSC_VER)
865 # if _MSC_VER >= 1700
866 # define IUTEST_HAS_STRONG_ENUMS 1
867 # endif
868 # endif
869 #endif
870 
871 #if !defined(IUTEST_HAS_STRONG_ENUMS)
872 # define IUTEST_HAS_STRONG_ENUMS 0
873 #endif
874 
875 // c++
877 #if !defined(IUTEST_HAS_EXCEPTIONS)
878 # if defined(_MSC_VER)
879 # if defined(_CPPUNWIND) && _CPPUNWIND
880 # define IUTEST_HAS_EXCEPTIONS 1
881 # endif
882 # elif defined(__BORLANDC__)
883 # ifndef _HAS_EXCEPTIONS
884 # define _HAS_EXCEPTIONS 1
885 # endif
886 # define IUTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
887 # elif defined(__clang__)
888 # if __EXCEPTIONS && __has_feature(cxx_exceptions)
889 # define IUTEST_HAS_EXCEPTIONS 1
890 # endif
891 # elif defined(__GNUC__)
892 # if defined(__EXCEPTIONS)
893 # define IUTEST_HAS_EXCEPTIONS 1
894 # endif
895 # elif defined(__MWERKS__)
896 # if __option(exceptions)
897 # define IUTEST_HAS_EXCEPTIONS 1
898 # endif
899 # endif
900 #endif
901 
902 #if !defined(IUTEST_HAS_EXCEPTIONS)
903 # define IUTEST_HAS_EXCEPTIONS 0
904 #endif
905 
907 #if !defined(IUTEST_HAS_SEH)
908 # if defined(_WIN32) && !defined(__clang__)
909 # if defined(_MSC_VER) && _MSC_VER > 1400
910 # define IUTEST_HAS_SEH IUTEST_HAS_EXCEPTIONS
911 # endif
912 # elif defined(__BORLANDC__)
913 # define IUTEST_HAS_SEH IUTEST_HAS_EXCEPTIONS
914 # endif
915 #endif
916 
917 #if !defined(IUTEST_HAS_SEH)
918 # define IUTEST_HAS_SEH 0
919 #endif
920 
922 #if !defined(IUTEST_HAS_RTTI)
923 # if defined(__clang__)
924 # if __has_feature(cxx_rtti)
925 # define IUTEST_HAS_RTTI 1
926 # endif
927 # if defined(_MSC_VER) // clang for windows
928 # if !defined(_CPPRTTI)
929 # include <exception>
930 # endif
931 # endif
932 # elif defined(__GNUC__)
933 # ifdef __RTTI
934 # define IUTEST_HAS_RTTI 1
935 # endif
936 # ifdef __GXX_RTTI
937 # define IUTEST_HAS_RTTI 1
938 # endif
939 # elif defined(__MWERKS__)
940 # if __option(RTTI)
941 # define IUTEST_HAS_RTTI 1
942 # endif
943 # elif defined(__ARMCC_VERSION)
944 # ifdef __RTTI
945 # define IUTEST_HAS_RTTI 1
946 # endif
947 # elif defined(__IBMCPP__)
948 # if (__IBMCPP__ >= 900)
949 # define IUTEST_HAS_RTTI 1
950 # endif
951 # elif defined(__INTEL_COMPILER)
952 # if defined(__INTEL_RTTI__) || defined(__cpp_rtti)
953 # define IUTEST_HAS_RTTI 1
954 # endif
955 # elif defined(_MSC_VER)
956 # ifdef _CPPRTTI
957 # define IUTEST_HAS_RTTI 1
958 # endif
959 # endif
960 #endif
961 
962 #if !defined(IUTEST_HAS_RTTI)
963 # define IUTEST_HAS_RTTI 0
964 #endif
965 
966 #if IUTEST_HAS_RTTI
967 # include <typeinfo>
968 #endif
969 
970 #if !defined(IUTEST_WCHAR_UNSIGNED)
971 # if defined(__WCHAR_UNSIGNED__) && __WCHAR_UNSIGNED__
972 # define IUTEST_WCHAR_UNSIGNED 1
973 # elif defined(_MSC_VER)
974 # if defined(_NATIVE_WCHAR_T_DEFINED)
975 # define IUTEST_WCHAR_UNSIGNED 1
976 # endif
977 # endif
978 #endif
979 
980 #if !defined(IUTEST_WCHAR_UNSIGNED)
981 # define IUTEST_WCHAR_UNSIGNED 0
982 #endif
983 
985 #if !defined(IUTEST_HAS_INT128)
986 # if defined(__SIZEOF_INT128__) && __SIZEOF_INT128__ == 16
987 # define IUTEST_HAS_INT128 1
988 # elif defined(_MSC_VER) && defined(_M_X64)
989 // https://docs.microsoft.com/ja-jp/cpp/cpp/fundamental-types-cpp?view=vs-2019
990 // __int128 is not supported
991 // # define IUTEST_HAS_INT128 1
992 # endif
993 #endif
994 
995 #if !defined(IUTEST_HAS_INT128)
996 # define IUTEST_HAS_INT128 0
997 #endif
998 
1000 #if !defined(IUTEST_HAS_FLOAT128)
1001 # if defined(__SIZEOF_FLOAT128__) && IUTEST_HAS_INT128
1002 # if defined(__clang__)
1003 # if IUTEST_CLANG_MAJOR > 4 && defined(__has_include)
1004 # if __has_include(<quadmath.h>)
1005 # define IUTEST_HAS_FLOAT128 1
1006 # endif
1007 # endif
1008 # else
1009 # define IUTEST_HAS_FLOAT128 1
1010 # endif
1011 # endif
1012 #endif
1013 
1014 #if !defined(IUTEST_HAS_FLOAT128)
1015 # define IUTEST_HAS_FLOAT128 0
1016 #endif
1017 
1018 #if IUTEST_HAS_FLOAT128
1019 # if defined(__FLT128_MANT_DIG__)
1020 # define IUTEST_FLT128_MANT_DIG __FLT128_MANT_DIG__
1021 # else
1022 # define IUTEST_FLT128_MANT_DIG 113
1023 # endif
1024 #endif
1025 
1027 #if !defined(IUTEST_LONG_DOUBLE_AS_IS_DOUBLE)
1028 # if defined(__SIZEOF_LONG_DOUBLE__) && defined(__SIZEOF_DOUBLE__) \
1029  && __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__
1030 # define IUTEST_LONG_DOUBLE_AS_IS_DOUBLE 1
1031 # endif
1032 #endif
1033 
1034 #if !defined(IUTEST_LONG_DOUBLE_AS_IS_DOUBLE)
1035 # define IUTEST_LONG_DOUBLE_AS_IS_DOUBLE 0
1036 #endif
1037 
1039 #if !defined(IUTEST_HAS_LONG_DOUBLE)
1040 # if defined(__SIZEOF_LONG_DOUBLE__)
1041 # if IUTEST_LONG_DOUBLE_AS_IS_DOUBLE || IUTEST_HAS_INT128
1042 # define IUTEST_HAS_LONG_DOUBLE 1
1043 # endif
1044 # endif
1045 #endif
1046 
1047 #if !defined(IUTEST_HAS_LONG_DOUBLE)
1048 # define IUTEST_HAS_LONG_DOUBLE 0
1049 #endif
1050 
1052 #if !defined(IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_MEMBER_FUNCTION)
1053 # if defined(_MSC_VER) && ((_MSC_VER < 1600) || (_MSC_VER == 1900))
1054 // VS2008 以前では、private なメンバー関数に explicit instantiation でもアクセスできない
1055 # define IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_MEMBER_FUNCTION 0
1056 # else
1057 # define IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_MEMBER_FUNCTION 1
1058 # endif
1059 #endif
1060 
1062 #if !defined(IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_STATIC_MEMBER_FUNCTION)
1063 # if defined(_MSC_VER) && (_MSC_VER < 1910)
1064 // Visual Studio では、private な static メンバー関数に explicit instantiation でもアクセスできない
1065 # define IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_STATIC_MEMBER_FUNCTION 0
1066 # else
1067 # define IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_STATIC_MEMBER_FUNCTION 1
1068 # endif
1069 #endif
1070 
1072 #if !defined(IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_OVERLOAD_MEMBER_FUNCTION)
1073 # if defined(_MSC_VER) && (_MSC_VER < 1900)
1074 # define IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_OVERLOAD_MEMBER_FUNCTION 0
1075 # elif defined(__clang__)
1076 // Does clang give priority to access restrictions during overload resolution?
1077 # define IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_OVERLOAD_MEMBER_FUNCTION 0
1078 # else
1079 # define IUTEST_EXPLICIT_INSTANTIATION_ACCESS_PRIVATE_OVERLOAD_MEMBER_FUNCTION 1
1080 # endif
1081 #endif
1082 
1083 // 可変長引数マクロ
1084 #if !defined(IUTEST_NO_VARIADIC_MACROS)
1085 # if defined(_MSC_VER) && (_MSC_VER < 1500)
1086 # define IUTEST_NO_VARIADIC_MACROS 1
1087 # endif
1088 #endif
1089 
1091 #if !defined(IUTEST_HAS_COUNTER_MACRO)
1092 # if defined(_MSC_VER) && (_MSC_VER >= 1300)
1093 # define IUTEST_HAS_COUNTER_MACRO 1
1094 # elif defined(__clang__)
1095 # define IUTEST_HAS_COUNTER_MACRO 1
1096 # elif defined(__GNUC__)
1097 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
1098 # define IUTEST_HAS_COUNTER_MACRO 1
1099 # endif
1100 # endif
1101 #endif
1102 
1103 #if !defined(IUTEST_HAS_COUNTER_MACRO)
1104 # define IUTEST_HAS_COUNTER_MACRO 0
1105 #endif
1106 
1108 #if !defined(IUTEST_HAS_CLASS_MEMBER_TEMPLATE_SPECIALIZATION)
1109 # if defined(_MSC_VER)
1110 # define IUTEST_HAS_CLASS_MEMBER_TEMPLATE_SPECIALIZATION 1
1111 # else
1112 # define IUTEST_HAS_CLASS_MEMBER_TEMPLATE_SPECIALIZATION 0
1113 # endif
1114 #endif
1115 
1117 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
1118 # if defined(_MSC_VER) && (_MSC_VER < 1310)
1119 # define IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 1
1120 # endif
1121 #endif
1122 
1124 #if !defined(IUTEST_NO_TWO_PHASE_NAME_LOOKUP)
1125 // Visual Studio 2017 (15.3) 以降は two phase name lookup が実装されている
1126 // (コンパイルオプションで無視できるが iutest はこれを検出しない)
1127 # if defined(_MSC_VER) && (_MSC_VER < 1910)
1128 # define IUTEST_NO_TWO_PHASE_NAME_LOOKUP 1
1129 # endif
1130 #endif
1131 
1133 #if !defined(IUTEST_NO_FUNCTION_TEMPLATE_ORDERING)
1134 # if defined(_MSC_VER) && (_MSC_VER < 1310)
1135 # define IUTEST_NO_FUNCTION_TEMPLATE_ORDERING 1
1136 # endif
1137 #endif
1138 
1140 #if !defined(IUTEST_NO_INCLASS_MEMBER_INITIALIZATION)
1141 # if defined(_MSC_VER) && _MSC_VER < 1310
1142 # define IUTEST_NO_INCLASS_MEMBER_INITIALIZATION 1
1143 # endif
1144 #endif
1145 
1147 #if !defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
1148 # if defined(_MSC_VER) && _MSC_VER < 1310
1149 # define IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS 1
1150 # endif
1151 #endif
1152 
1154 #if !defined(IUTEST_NO_SFINAE)
1155 # if defined(_MSC_VER) && _MSC_VER < 1310
1156 # define IUTEST_NO_SFINAE 1
1157 # endif
1158 #endif
1159 
1161 #if !defined(IUTEST_NO_TEMPLATE_TEMPLATES)
1162 # if defined(_MSC_VER) && _MSC_VER < 1310
1163 # define IUTEST_NO_TEMPLATE_TEMPLATES 1
1164 # endif
1165 #endif
1166 
1168 #if !defined(IUTEST_NO_VOID_RETURNS)
1169 # if defined(_MSC_VER) && _MSC_VER < 1300
1170 # define IUTEST_NO_VOID_RETURNS 1
1171 # endif
1172 #endif
1173 
1175 #if !defined(IUTEST_NO_ARGUMENT_DEPENDENT_LOOKUP)
1176 # if defined(_MSC_VER) && _MSC_VER < 1310
1177 # define IUTEST_NO_ARGUMENT_DEPENDENT_LOOKUP 1
1178 # endif
1179 #endif
1180 
1181 #if !defined(IUTEST_NO_PRIVATE_IN_AGGREGATE)
1182 # if defined(_MSC_VER) && _MSC_VER < 1310
1183 # define IUTEST_NO_PRIVATE_IN_AGGREGATE 1
1184 # endif
1185 #endif
1186 
1188 #if !defined(IUTEST_HAS_WANT_SECURE_LIB)
1189 # if defined(_MSC_VER)
1190 # if defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__
1191 # define IUTEST_HAS_WANT_SECURE_LIB 1
1192 # endif
1193 # endif
1194 #endif
1195 
1196 #if !defined(IUTEST_HAS_WANT_SECURE_LIB)
1197 # define IUTEST_HAS_WANT_SECURE_LIB 0
1198 #endif
1199 
1200 // MS extensions
1201 
1203 #if !defined(IUTEST_HAS_MS_EXTENSIONS)
1204 # if defined(__clang__)
1205 //# if defined(_MSC_VER)
1206 //# define IUTEST_HAS_MS_EXTENSIONS 1
1207 //# endif
1208 # elif defined(_MSC_VER)
1209 # define IUTEST_HAS_MS_EXTENSIONS 1
1210 # endif
1211 #endif
1212 
1213 #if !defined(IUTEST_HAS_MS_EXTENSIONS)
1214 # define IUTEST_HAS_MS_EXTENSIONS 0
1215 #endif
1216 
1218 #if !defined(IUTEST_HAS_IF_EXISTS)
1219 # if defined(__clang__)
1220 # if IUTEST_HAS_MS_EXTENSIONS && (IUTEST_CLANG_MAJOR > 3 || (IUTEST_CLANG_MAJOR == 3 && IUTEST_CLANG_MINOR >= 5) )
1221 # define IUTEST_HAS_IF_EXISTS 1
1222 # endif
1223 # elif defined(_MSC_VER) && _MSC_VER >= 1310
1224 # define IUTEST_HAS_IF_EXISTS 1
1225 # endif
1226 #endif
1227 
1228 #if !defined(IUTEST_HAS_IF_EXISTS)
1229 # define IUTEST_HAS_IF_EXISTS 0
1230 #endif
1231 
1233 #if !defined(IUTEST_HAS_ANALYSIS_ASSUME)
1234 # if defined(_MSC_VER) && (_MSC_VER >= 1500) && !defined(__CUDACC__)
1235 # define IUTEST_HAS_ANALYSIS_ASSUME 1
1236 # define IUTEST_ANALYSIS_ASSUME __analysis_assume
1237 //# elif defined(__clang__)
1238 //# if __has_builtin(__builtin_assume)
1239 //# define IUTEST_HAS_ANALYSIS_ASSUME 1
1240 //# define IUTEST_ANALYSIS_ASSUME __builtin_assume
1241 //# endif
1242 # endif
1243 #endif
1244 
1245 #if !defined(IUTEST_HAS_ANALYSIS_ASSUME)
1246 # define IUTEST_HAS_ANALYSIS_ASSUME 0
1247 #endif
1248 #if !defined(IUTEST_ANALYSIS_ASSUME)
1249 # if defined(IUTEST_NO_VARIADIC_MACROS)
1250 # define IUTEST_ANALYSIS_ASSUME(x) (void)0
1251 # else
1252 # define IUTEST_ANALYSIS_ASSUME(...) (void)0
1253 # endif
1254 #endif
1255 
1256 #if !defined(IUTEST_HAS_MS_CXX_MODULE)
1257 # if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023506
1258 # define IUTEST_HAS_MS_CXX_MODULE 1
1259 # endif
1260 #endif
1261 
1262 #if !defined(IUTEST_HAS_MS_CXX_MODULE)
1263 # define IUTEST_HAS_MS_CXX_MODULE 0
1264 #endif
1265 
1266 #if IUTEST_HAS_MS_CXX_MODULE
1267 # define IUTEST_CXX_MODULE_EXPORT export
1268 #else
1269 # define IUTEST_CXX_MODULE_EXPORT
1270 #endif
1271 
1272 // C11
1273 
1275 #if !defined(IUTEST_HAS_GENERIC)
1276 # if defined(__clang__)
1277 # if __has_feature(c_generic_selections)
1278 # define IUTEST_HAS_GENERIC 1
1279 # endif
1280 # elif defined(__GNUC__)
1281 //# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))
1282 //# define IUTEST_HAS_GENERIC 1
1283 //# endif
1284 # endif
1285 #endif
1286 
1287 #if !defined(IUTEST_HAS_GENERIC)
1288 # define IUTEST_HAS_GENERIC 0
1289 #endif
1290 
1291 // attribute
1292 
1294 #if !defined(IUTEST_HAS_ATTRIBUTE)
1295 # if defined(__cpp_attributes) && __cpp_attributes >= 200809
1296 # define IUTEST_HAS_ATTRIBUTE 1
1297 # elif defined(__clang__)
1298 # if __has_feature(cxx_attributes)
1299 # define IUTEST_HAS_ATTRIBUTE 1
1300 # endif
1301 # elif defined(__GNUC__)
1302 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
1303 # define IUTEST_HAS_ATTRIBUTE 1
1304 # endif
1305 # elif defined(_MSC_VER)
1306 # if _MSC_VER > 1800
1307 # define IUTEST_HAS_ATTRIBUTE 1
1308 # endif
1309 # endif
1310 #endif
1311 
1312 #if !defined(IUTEST_HAS_ATTRIBUTE)
1313 # define IUTEST_HAS_ATTRIBUTE 0
1314 #endif
1315 
1317 #if !defined(IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY)
1318 # if defined(__has_cpp_attribute)
1319 # if __has_cpp_attribute(likely) >= 201803L && __has_cpp_attribute(unlikely) >= 201803L
1320 # if defined(__GNUC__) && (__GNUC__ <= 9)
1321 // gcc 9.X likely is experimental. can be used in switch~case, cannot be used in if statement
1322 # define IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY 0
1323 # else
1324 # define IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY IUTEST_HAS_ATTRIBUTE
1325 # endif
1326 # endif
1327 # endif
1328 #endif
1329 
1330 #if !defined(IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY)
1331 # define IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY 0
1332 #endif
1333 
1335 #if !defined(IUTEST_ATTRIBUTE_LIKELY_)
1336 # if IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY
1337 # define IUTEST_ATTRIBUTE_LIKELY_ [[likely]]
1338 # else
1339 # endif
1340 #endif
1341 
1342 #if !defined(IUTEST_ATTRIBUTE_LIKELY_)
1343 # define IUTEST_ATTRIBUTE_LIKELY_
1344 #endif
1345 
1347 #if !defined(IUTEST_ATTRIBUTE_UNLIKELY_)
1348 # if IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY
1349 # define IUTEST_ATTRIBUTE_UNLIKELY_ [[unlikely]]
1350 # else
1351 # endif
1352 #endif
1353 
1354 #if !defined(IUTEST_ATTRIBUTE_UNLIKELY_)
1355 # define IUTEST_ATTRIBUTE_UNLIKELY_
1356 #endif
1357 
1359 #if !defined(IUTEST_HAS_ATTRIBUTE_DEPRECATED)
1360 # if defined(__has_cpp_attribute)
1361 # if __has_cpp_attribute(deprecated) >= 201309
1362 # define IUTEST_HAS_ATTRIBUTE_DEPRECATED IUTEST_HAS_ATTRIBUTE
1363 # endif
1364 # elif defined(__GNUC__)
1365 # if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
1366 # define IUTEST_HAS_ATTRIBUTE_DEPRECATED 1
1367 # endif
1368 # elif defined(__clang__)
1369 # if IUTEST_CLANG_MAJOR > 3 || (IUTEST_CLANG_MAJOR == 3 && IUTEST_CLANG_MINOR >= 4)
1370 # define IUTEST_HAS_ATTRIBUTE_DEPRECATED 1
1371 # endif
1372 # elif defined(_MSC_VER)
1373 # define IUTEST_HAS_ATTRIBUTE_DEPRECATED IUTEST_HAS_ATTRIBUTE
1374 # endif
1375 #endif
1376 
1377 #if !defined(IUTEST_HAS_ATTRIBUTE_DEPRECATED)
1378 # define IUTEST_HAS_ATTRIBUTE_DEPRECATED 0
1379 #endif
1380 
1382 #if !defined(IUTEST_ATTRIBUTE_DEPRECATED_)
1383 # if IUTEST_HAS_ATTRIBUTE_DEPRECATED
1384 # define IUTEST_ATTRIBUTE_DEPRECATED_ [[deprecated]]
1385 # endif
1386 #endif
1387 
1388 #if !defined(IUTEST_ATTRIBUTE_DEPRECATED_)
1389 # define IUTEST_ATTRIBUTE_DEPRECATED_
1390 #endif
1391 
1393 #if !defined(IUTEST_ATTRIBUTE_UNUSED_)
1394 # if (defined(__GNUC__) && !defined(COMPILER_ICC))
1395 # define IUTEST_ATTRIBUTE_UNUSED_ __attribute__((unused))
1396 # elif defined(__clang__)
1397 # if __has_attribute(unused)
1398 # define IUTEST_ATTRIBUTE_UNUSED_ __attribute__((unused))
1399 # endif
1400 # endif
1401 #endif
1402 
1403 #if !defined(IUTEST_ATTRIBUTE_UNUSED_)
1404 # define IUTEST_ATTRIBUTE_UNUSED_
1405 #endif
1406 
1408 #if !defined(IUTEST_ATTRIBUTE_PURE_)
1409 # if defined(__GNUC__) && !defined(COMPILER_ICC)
1410 # define IUTEST_ATTRIBUTE_PURE_ __attribute__((pure))
1411 # else
1412 # define IUTEST_ATTRIBUTE_PURE_
1413 # endif
1414 #endif
1415 
1417 #if !defined(IUTEST_ATTRIBUTE_NORETURN_)
1418 # if IUTEST_HAS_ATTRIBUTE
1419 # define IUTEST_ATTRIBUTE_NORETURN_ [[noreturn]]
1420 # elif defined(__clang__)
1421 # if __has_attribute(noreturn)
1422 # define IUTEST_ATTRIBUTE_NORETURN_ __attribute__((noreturn))
1423 # endif
1424 # elif defined(__GNUC__) && !defined(COMPILER_ICC)
1425 # define IUTEST_ATTRIBUTE_NORETURN_ __attribute__((noreturn))
1426 # elif defined(_MSC_VER)
1427 # define IUTEST_ATTRIBUTE_NORETURN_ __declspec(noreturn)
1428 # endif
1429 #endif
1430 
1431 #if !defined(IUTEST_ATTRIBUTE_NORETURN_)
1432 # define IUTEST_ATTRIBUTE_NORETURN_
1433 #endif
1434 
1436 #if !defined(IUTEST_ATTRIBUTE_INIT_PRIORITY_)
1437 # if defined(__clang__)
1438 # if __has_attribute(init_priority)
1439 # define IUTEST_ATTRIBUTE_INIT_PRIORITY_(n) __attribute__((init_priority(n)))
1440 # endif
1441 # elif defined(__GNUC__) && !defined(COMPILER_ICC)
1442 # define IUTEST_ATTRIBUTE_INIT_PRIORITY_(n) __attribute__((init_priority(n)))
1443 # endif
1444 #endif
1445 
1446 #if !defined(IUTEST_ATTRIBUTE_INIT_PRIORITY_)
1447 # define IUTEST_ATTRIBUTE_INIT_PRIORITY_(n)
1448 #endif
1449 
1451 #if !defined(IUTEST_ATTRIBUTE_FORMAT)
1452 # if defined(__has_attribute)
1453 # if __has_attribute(format)
1454 # define IUTEST_ATTRIBUTE_FORMAT(fmt, fi, vi) __attribute__ ((__format__ (fmt, fi, vi)))
1455 # endif
1456 # elif defined(__GNUC__) && !defined(COMPILER_ICC)
1457 # define IUTEST_ATTRIBUTE_FORMAT(fmt, fi, vi) __attribute__ ((__format__ (fmt, fi, vi)))
1458 # endif
1459 #endif
1460 
1462 #if !defined(IUTEST_ATTRIBUTE_FORMAT_PRINTF) && defined(IUTEST_ATTRIBUTE_FORMAT)
1463 # if defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)
1464 # if !defined(__MINGW_PRINTF_FORMAT)
1465 # define __MINGW_PRINTF_FORMAT gnu_printf
1466 # endif
1467 # define IUTEST_ATTRIBUTE_FORMAT_PRINTF(fi, vi) IUTEST_ATTRIBUTE_FORMAT(__MINGW_PRINTF_FORMAT, fi, vi)
1468 # else
1469 # define IUTEST_ATTRIBUTE_FORMAT_PRINTF(fi, vi) IUTEST_ATTRIBUTE_FORMAT(__printf__, fi, vi)
1470 # endif
1471 #endif
1472 
1473 #if !defined(IUTEST_ATTRIBUTE_FORMAT)
1474 # define IUTEST_ATTRIBUTE_FORMAT(fmt, fi, vi)
1475 #endif
1476 #if !defined(IUTEST_ATTRIBUTE_FORMAT_PRINTF)
1477 # define IUTEST_ATTRIBUTE_FORMAT_PRINTF(fi, vi)
1478 #endif
1479 
1480 
1481 // builtin
1482 
1484 #if !defined(IUTEST_HAS_BUILTIN_EXPECT)
1485 # if defined(__clang__) || defined(__GNUC__)
1486 # define IUTEST_HAS_BUILTIN_EXPECT 1
1487 # endif
1488 #endif
1489 
1490 #if !defined(IUTEST_HAS_BUILTIN_EXPECT)
1491 # define IUTEST_HAS_BUILTIN_EXPECT 0
1492 #endif
1493 
1494 #if !defined(IUTEST_COND_LIKELY)
1495 # if IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY
1496 # define IUTEST_COND_LIKELY(cond) (cond) IUTEST_ATTRIBUTE_LIKELY_
1497 # elif IUTEST_HAS_BUILTIN_EXPECT
1498 # define IUTEST_COND_LIKELY(cond) (__builtin_expect(static_cast<bool>(!!(cond)), 1))
1499 # else
1500 # define IUTEST_COND_LIKELY(cond) (cond)
1501 # endif
1502 #endif
1503 
1504 #if !defined(IUTEST_COND_UNLIKELY)
1505 # if IUTEST_HAS_ATTRIBUTE_LIKELY_UNLIKELY
1506 # define IUTEST_COND_UNLIKELY(cond) (cond) IUTEST_ATTRIBUTE_UNLIKELY_
1507 # elif IUTEST_HAS_BUILTIN_EXPECT
1508 # define IUTEST_COND_UNLIKELY(cond) (__builtin_expect(static_cast<bool>(!!(cond)), 0))
1509 # else
1510 # define IUTEST_COND_UNLIKELY(cond) (cond)
1511 # endif
1512 #endif
1513 
1515 #if !defined(IUTEST_HAS_MEMORY_SANITIZER)
1516 # if defined(__has_feature)
1517 # if __has_feature(memory_sanitizer)
1518 # define IUTEST_HAS_MEMORY_SANITIZER 1
1519 # endif
1520 # endif
1521 #endif
1522 
1523 #if !defined(IUTEST_HAS_MEMORY_SANITIZER)
1524 # define IUTEST_HAS_MEMORY_SANITIZER 0
1525 #endif
1526 
1527 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_MEMORY)
1528 # if IUTEST_HAS_MEMORY_SANITIZER
1529 # if defined(__clang__)
1530 # define IUTEST_ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
1531 # elif defined(__GNUC__) && !defined(COMPILER_ICC)
1532 # define IUTEST_ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
1533 # endif
1534 # endif
1535 #endif
1536 
1537 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_MEMORY)
1538 # define IUTEST_ATTRIBUTE_NO_SANITIZE_MEMORY
1539 #endif
1540 
1542 #if !defined(IUTEST_HAS_ADDRESS_SANITIZER)
1543 # if defined(__has_feature)
1544 # if __has_feature(address_sanitizer)
1545 # define IUTEST_HAS_ADDRESS_SANITIZER 1
1546 # endif
1547 # endif
1548 #endif
1549 
1550 #if !defined(IUTEST_HAS_ADDRESS_SANITIZER)
1551 # define IUTEST_HAS_ADDRESS_SANITIZER 0
1552 #endif
1553 
1554 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS)
1555 # if IUTEST_HAS_ADDRESS_SANITIZER
1556 # if defined(__clang__)
1557 # define IUTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
1558 # elif defined(__GNUC__) && !defined(COMPILER_ICC)
1559 # define IUTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
1560 # endif
1561 # endif
1562 #endif
1563 
1564 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS)
1565 # define IUTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS
1566 #endif
1567 
1569 #if !defined(IUTEST_HAS_THREAD_SANITIZER)
1570 # if defined(__has_feature)
1571 # if __has_feature(thread_sanitizer)
1572 # define IUTEST_HAS_THREAD_SANITIZER 1
1573 # endif
1574 # endif
1575 #endif
1576 
1577 #if !defined(IUTEST_HAS_THREAD_SANITIZER)
1578 # define IUTEST_HAS_THREAD_SANITIZER 0
1579 #endif
1580 
1581 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_THREAD)
1582 # if IUTEST_HAS_THREAD_SANITIZER
1583 # if defined(__clang__)
1584 # define IUTEST_ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
1585 # elif defined(__GNUC__) && !defined(COMPILER_ICC)
1586 # define IUTEST_ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
1587 # endif
1588 # endif
1589 #endif
1590 
1591 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_THREAD)
1592 # define IUTEST_ATTRIBUTE_NO_SANITIZE_THREAD
1593 #endif
1594 
1595 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_ALL)
1596 # define IUTEST_ATTRIBUTE_NO_SANITIZE_ALL \
1597  IUTEST_ATTRIBUTE_NO_SANITIZE_MEMORY \
1598  IUTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS \
1599  IUTEST_ATTRIBUTE_NO_SANITIZE_THREAD
1600 #endif
1601 
1602 #if !defined(IUTEST_ATTRIBUTE_NO_SANITIZE_ALL)
1603 # define IUTEST_ATTRIBUTE_NO_SANITIZE_ALL
1604 #endif
1605 
1606 // workaround
1612 #if defined(_MSC_VER)
1613 // https://stackoverflow.com/questions/14487241/avoiding-an-inheritance-by-dominance-warning-for-a-mocked-stdfstream-class
1614 # define IUTEST_WORKAROUND_MSC_STLSTREAM_C4250() \
1615  void _Add_vtordisp1() {} \
1616  void _Add_vtordisp2() {}
1617 #else
1618 # define IUTEST_WORKAROUND_MSC_STLSTREAM_C4250()
1619 #endif
1620 
1625 // pragma
1626 #include "iutest_pragma.hpp"
1627 
1628 #if defined(_MSC_VER) && _MSC_VER < 1300
1629 # pragma warning(disable:4786) // ident trunc to '255' chars in debug info
1630 #endif
1631 
1632 #endif // INCG_IRIS_IUTEST_COMPILER_HPP_6DDB27E8_E2FF_4754_80B0_F500025820C4_
iris unit test platform detection
pragma macros