File indexing completed on 2025-10-30 08:37:24
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 #ifndef CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
0009 #define CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 #include <catch2/internal/catch_platform.hpp>
0028 #include <catch2/catch_user_config.hpp>
0029 
0030 #ifdef __cplusplus
0031 
0032 #  if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
0033 #    define CATCH_CPP17_OR_GREATER
0034 #  endif
0035 
0036 #  if (__cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
0037 #    define CATCH_CPP20_OR_GREATER
0038 #  endif
0039 
0040 #endif
0041 
0042 
0043 
0044 #if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__) && !defined(__NVCOMPILER)
0045 #    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" )
0046 #    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( "GCC diagnostic pop" )
0047 
0048 
0049 
0050 #    define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
0051          _Pragma( "GCC diagnostic ignored \"-Wparentheses\"" )
0052 
0053 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_RESULT \
0054          _Pragma( "GCC diagnostic ignored \"-Wunused-result\"" )
0055 
0056 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
0057          _Pragma( "GCC diagnostic ignored \"-Wunused-variable\"" )
0058 
0059 #    define CATCH_INTERNAL_SUPPRESS_USELESS_CAST_WARNINGS \
0060          _Pragma( "GCC diagnostic ignored \"-Wuseless-cast\"" )
0061 
0062 #    define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
0063          _Pragma( "GCC diagnostic ignored \"-Wshadow\"" )
0064 
0065 #    define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
0066 
0067 #endif
0068 
0069 #if defined(__NVCOMPILER)
0070 #    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "diag push" )
0071 #    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( "diag pop" )
0072 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS _Pragma( "diag_suppress declared_but_not_referenced" )
0073 #endif
0074 
0075 #if defined(__CUDACC__) && !defined(__clang__)
0076 #  ifdef __NVCC_DIAG_PRAGMA_SUPPORT__
0077 
0078 #    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "nv_diagnostic push" )
0079 #    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( "nv_diagnostic pop" )
0080 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS _Pragma( "nv_diag_suppress 177" )
0081 #  else
0082 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS _Pragma( "diag_suppress 177" )
0083 #  endif
0084 #endif
0085 
0086 
0087 
0088 #if defined(__clang__) && !defined(_MSC_VER)
0089 #    define CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P
0090 #    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
0091 #    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( "clang diagnostic pop" )
0092 #endif 
0093 
0094 #if defined(__clang__)
0095 
0096 #    define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
0097          _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
0098          _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
0099 
0100 #    define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
0101          _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
0102 
0103 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS \
0104          _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
0105 
0106 #    define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
0107          _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
0108 
0109 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
0110          _Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
0111 
0112 #    define CATCH_INTERNAL_SUPPRESS_COMMA_WARNINGS \
0113         _Pragma( "clang diagnostic ignored \"-Wcomma\"" )
0114 
0115 #    define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS \
0116         _Pragma( "clang diagnostic ignored \"-Wshadow\"" )
0117 
0118 #endif 
0119 
0120 
0121 
0122 
0123 
0124 
0125 
0126 
0127 
0128 
0129 
0130 
0131 
0132 
0133 
0134 
0135 
0136 #if defined( __ibmxl__ ) || defined( __CUDACC__ ) || defined( __NVCOMPILER )
0137 #    define CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P
0138 #endif
0139 
0140 
0141 
0142 
0143 
0144 #if defined( CATCH_PLATFORM_WINDOWS ) ||                                       \
0145     defined( CATCH_PLATFORM_PLAYSTATION ) ||                                   \
0146     defined( __CYGWIN__ ) ||                                                   \
0147     defined( __QNX__ ) ||                                                      \
0148     defined( __EMSCRIPTEN__ ) ||                                               \
0149     defined( __DJGPP__ ) ||                                                    \
0150     defined( __OS400__ )
0151 #    define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
0152 #else
0153 #    define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS
0154 #endif
0155 
0156 
0157 
0158 #if defined( CATCH_PLATFORM_WINDOWS_UWP ) ||                                   \
0159     defined( CATCH_PLATFORM_PLAYSTATION ) ||                                   \
0160     defined( _GAMING_XBOX )
0161 #    define CATCH_INTERNAL_CONFIG_NO_GETENV
0162 #else
0163 #    define CATCH_INTERNAL_CONFIG_GETENV
0164 #endif
0165 
0166 
0167 
0168 #if defined(__ANDROID__)
0169 #    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
0170 #endif
0171 
0172 
0173 
0174 #if defined(__MINGW32__)
0175 #    define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
0176 #endif
0177 
0178 
0179 
0180 #if defined(__ORBIS__)
0181 #    define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE
0182 #endif
0183 
0184 
0185 
0186 #ifdef __CYGWIN__
0187 
0188 
0189 
0190 #   define _BSD_SOURCE
0191 
0192 
0193 # if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
0194            && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
0195 
0196 #    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
0197 
0198 # endif
0199 #endif 
0200 
0201 
0202 
0203 #if defined(_MSC_VER)
0204 
0205 
0206 
0207 #    if !defined( __CUDACC__ )
0208 #        define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
0209             __pragma( warning( push ) )
0210 #        define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
0211             __pragma( warning( pop ) )
0212 #    endif
0213 
0214 
0215 
0216 #  if defined(CATCH_PLATFORM_WINDOWS_UWP)
0217 #    define CATCH_INTERNAL_CONFIG_NO_COLOUR_WIN32
0218 #  else
0219 #    define CATCH_INTERNAL_CONFIG_WINDOWS_SEH
0220 #  endif
0221 
0222 
0223 
0224 
0225 #  if !defined(__clang__) 
0226 #    if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)
0227 #      define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
0228 #    endif 
0229 #  endif 
0230 
0231 #endif 
0232 
0233 #if defined(_REENTRANT) || defined(_MSC_VER)
0234 
0235 # define CATCH_INTERNAL_CONFIG_USE_ASYNC
0236 #endif 
0237 
0238 
0239 
0240 #if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)
0241 #  define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED
0242 #endif
0243 
0244 
0245 
0246 
0247 #if defined(__BORLANDC__)
0248     #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN
0249 #endif
0250 
0251 
0252 
0253 
0254 
0255 
0256 #if defined(UNDER_RTSS) || defined(RTX64_BUILD)
0257     #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
0258     #define CATCH_INTERNAL_CONFIG_NO_ASYNC
0259     #define CATCH_INTERNAL_CONFIG_NO_COLOUR_WIN32
0260 #endif
0261 
0262 #if !defined(_GLIBCXX_USE_C99_MATH_TR1)
0263 #define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER
0264 #endif
0265 
0266 
0267 #if defined(__has_include)
0268   
0269   #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)
0270   #    define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW
0271   #endif
0272 
0273   
0274   #  if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
0275   #    define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL
0276   #  endif 
0277 
0278   
0279   #  if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
0280   #    include <cstddef>
0281   #    if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0)
0282   #      define CATCH_INTERNAL_CONFIG_CPP17_BYTE
0283   #    endif
0284   #  endif 
0285 
0286   
0287   #  if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
0288   #    if defined(__clang__) && (__clang_major__ < 8)
0289          
0290          
0291   #      include <ciso646>
0292   #      if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
0293   #        define CATCH_CONFIG_NO_CPP17_VARIANT
0294   #      else
0295   #        define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
0296   #      endif 
0297   #    else
0298   #      define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
0299   #    endif 
0300   #  endif 
0301 #endif 
0302 
0303 
0304 #if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH)
0305 #   define CATCH_CONFIG_WINDOWS_SEH
0306 #endif
0307 
0308 #if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS)
0309 #   define CATCH_CONFIG_POSIX_SIGNALS
0310 #endif
0311 
0312 #if defined(CATCH_INTERNAL_CONFIG_GETENV) && !defined(CATCH_INTERNAL_CONFIG_NO_GETENV) && !defined(CATCH_CONFIG_NO_GETENV) && !defined(CATCH_CONFIG_GETENV)
0313 #   define CATCH_CONFIG_GETENV
0314 #endif
0315 
0316 #if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)
0317 #    define CATCH_CONFIG_CPP11_TO_STRING
0318 #endif
0319 
0320 #if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL)
0321 #  define CATCH_CONFIG_CPP17_OPTIONAL
0322 #endif
0323 
0324 #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)
0325 #  define CATCH_CONFIG_CPP17_STRING_VIEW
0326 #endif
0327 
0328 #if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT)
0329 #  define CATCH_CONFIG_CPP17_VARIANT
0330 #endif
0331 
0332 #if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE)
0333 #  define CATCH_CONFIG_CPP17_BYTE
0334 #endif
0335 
0336 
0337 #if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
0338 #  define CATCH_INTERNAL_CONFIG_NEW_CAPTURE
0339 #endif
0340 
0341 #if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE)
0342 #  define CATCH_CONFIG_NEW_CAPTURE
0343 #endif
0344 
0345 #if !defined( CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED ) && \
0346     !defined( CATCH_CONFIG_DISABLE_EXCEPTIONS ) &&          \
0347     !defined( CATCH_CONFIG_NO_DISABLE_EXCEPTIONS )
0348 #  define CATCH_CONFIG_DISABLE_EXCEPTIONS
0349 #endif
0350 
0351 #if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN)
0352 #  define CATCH_CONFIG_POLYFILL_ISNAN
0353 #endif
0354 
0355 #if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC)  && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)
0356 #  define CATCH_CONFIG_USE_ASYNC
0357 #endif
0358 
0359 #if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
0360 #  define CATCH_CONFIG_GLOBAL_NEXTAFTER
0361 #endif
0362 
0363 
0364 
0365 
0366 #if defined( CATCH_INTERNAL_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
0367     !defined( CATCH_INTERNAL_CONFIG_NO_USE_BUILTIN_CONSTANT_P ) && !defined(CATCH_CONFIG_USE_BUILTIN_CONSTANT_P)
0368 #define CATCH_CONFIG_USE_BUILTIN_CONSTANT_P
0369 #endif
0370 
0371 #if defined( CATCH_CONFIG_USE_BUILTIN_CONSTANT_P ) && \
0372     !defined( CATCH_CONFIG_NO_USE_BUILTIN_CONSTANT_P )
0373 #    define CATCH_INTERNAL_IGNORE_BUT_WARN( ... )                                              \
0374         (void)__builtin_constant_p( __VA_ARGS__ ) 
0375 
0376 #else
0377 #    define CATCH_INTERNAL_IGNORE_BUT_WARN( ... )
0378 #endif
0379 
0380 
0381 
0382 #if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
0383 #   define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
0384 #endif
0385 #if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)
0386 #   define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
0387 #endif
0388 #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
0389 #   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
0390 #endif
0391 #if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)
0392 #   define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
0393 #endif
0394 #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_RESULT)
0395 #   define CATCH_INTERNAL_SUPPRESS_UNUSED_RESULT
0396 #endif
0397 #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS)
0398 #   define CATCH_INTERNAL_SUPPRESS_UNUSED_VARIABLE_WARNINGS
0399 #endif
0400 #if !defined(CATCH_INTERNAL_SUPPRESS_USELESS_CAST_WARNINGS)
0401 #   define CATCH_INTERNAL_SUPPRESS_USELESS_CAST_WARNINGS
0402 #endif
0403 #if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)
0404 #   define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
0405 #endif
0406 #if !defined( CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS )
0407 #    define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
0408 #endif
0409 #if !defined( CATCH_INTERNAL_SUPPRESS_COMMA_WARNINGS )
0410 #    define CATCH_INTERNAL_SUPPRESS_COMMA_WARNINGS
0411 #endif
0412 #if !defined( CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS )
0413 #    define CATCH_INTERNAL_SUPPRESS_SHADOW_WARNINGS
0414 #endif
0415 
0416 #if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
0417 #   undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
0418 #elif defined(__clang__) && (__clang_major__ < 5)
0419 #   undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
0420 #endif
0421 
0422 
0423 #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
0424 #define CATCH_TRY if ((true))
0425 #define CATCH_CATCH_ALL if ((false))
0426 #define CATCH_CATCH_ANON(type) if ((false))
0427 #else
0428 #define CATCH_TRY try
0429 #define CATCH_CATCH_ALL catch (...)
0430 #define CATCH_CATCH_ANON(type) catch (type)
0431 #endif
0432 
0433 #if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)
0434 #define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
0435 #endif
0436 
0437 #if defined( CATCH_PLATFORM_WINDOWS ) &&       \
0438     !defined( CATCH_CONFIG_COLOUR_WIN32 ) && \
0439     !defined( CATCH_CONFIG_NO_COLOUR_WIN32 ) && \
0440     !defined( CATCH_INTERNAL_CONFIG_NO_COLOUR_WIN32 )
0441 #    define CATCH_CONFIG_COLOUR_WIN32
0442 #endif
0443 
0444 #if defined( CATCH_CONFIG_SHARED_LIBRARY ) && defined( _MSC_VER ) && \
0445     !defined( CATCH_CONFIG_STATIC )
0446 #    ifdef Catch2_EXPORTS
0447 #        define CATCH_EXPORT 
0448 #    else
0449 #        define CATCH_EXPORT __declspec( dllimport )
0450 #    endif
0451 #else
0452 #    define CATCH_EXPORT
0453 #endif
0454 
0455 #endif