| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 | /* *  Created by Phil on 15/04/2013. *  Copyright 2013 Two Blue Cubes Ltd. All rights reserved. * *  Distributed under the Boost Software License, Version 1.0. (See accompanying *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */#ifndef TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED#define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED// Detect a number of compiler features - by compiler// The following features are defined://// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported?// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported?// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported?// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled?// ****************// Note to maintainers: if new toggles are added please document them// in configuration.md, too// ****************// In general each macro has a _NO_<feature name> form// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature.// Many features, at point of detection, define an _INTERNAL_ macro, so they// can be combined, en-mass, with the _NO_ forms later.#include "catch_platform.h"#ifdef __cplusplus#  if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)#    define CATCH_CPP14_OR_GREATER#  endif#  if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)#    define CATCH_CPP17_OR_GREATER#  endif#endif// Only GCC compiler should be used in this block, so other compilers trying to// mask themselves as GCC should be ignored.#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__)#    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" )#    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( "GCC diagnostic pop" )#    define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)#endif#if defined(__clang__)#    define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )#    define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  _Pragma( "clang diagnostic pop" )// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug// which results in calls to destructors being emitted for each temporary,// without a matching initialization. In practice, this can result in something// like `std::string::~string` being called on an uninitialized value.//// For example, this code will likely segfault under IBM XL:// ```// REQUIRE(std::string("12") + "34" == "1234")// ```//// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.#  if !defined(__ibmxl__) && !defined(__CUDACC__)#    define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */#  endif#    define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \         _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \         _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")#    define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \         _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )#    define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \         _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )#    define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \         _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )#    define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \         _Pragma( "clang diagnostic ignored \"-Wunused-template\"" )#endif // __clang__////////////////////////////////////////////////////////////////////////////////// Assume that non-Windows platforms support posix signals by default#if !defined(CATCH_PLATFORM_WINDOWS)    #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS#endif////////////////////////////////////////////////////////////////////////////////// We know some environments not to support full POSIX signals#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__)    #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS#endif#ifdef __OS400__#       define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS#       define CATCH_CONFIG_COLOUR_NONE#endif////////////////////////////////////////////////////////////////////////////////// Android somehow still does not support std::to_string#if defined(__ANDROID__)#    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING#    define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE#endif////////////////////////////////////////////////////////////////////////////////// Not all Windows environments support SEH properly#if defined(__MINGW32__)#    define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH#endif////////////////////////////////////////////////////////////////////////////////// PS4#if defined(__ORBIS__)#    define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE#endif////////////////////////////////////////////////////////////////////////////////// Cygwin#ifdef __CYGWIN__// Required for some versions of Cygwin to declare gettimeofday// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin#   define _BSD_SOURCE// some versions of cygwin (most) do not support std::to_string. Use the libstd check.// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \           && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))#    define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING# endif#endif // __CYGWIN__////////////////////////////////////////////////////////////////////////////////// Visual C++#if defined(_MSC_VER)#  define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) )#  define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION  __pragma( warning(pop) )// Universal Windows platform does not support SEH// Or console colours (or console at all...)#  if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)#    define CATCH_CONFIG_COLOUR_NONE#  else#    define CATCH_INTERNAL_CONFIG_WINDOWS_SEH#  endif// MSVC traditional preprocessor needs some workaround for __VA_ARGS__// _MSVC_TRADITIONAL == 0 means new conformant preprocessor// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor#  if !defined(__clang__) // Handle Clang masquerading for msvc#    if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)#      define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR#    endif // MSVC_TRADITIONAL#  endif // __clang__#endif // _MSC_VER#if defined(_REENTRANT) || defined(_MSC_VER)// Enable async processing, as -pthread is specified or no additional linking is required# define CATCH_INTERNAL_CONFIG_USE_ASYNC#endif // _MSC_VER////////////////////////////////////////////////////////////////////////////////// Check if we are compiled with -fno-exceptions or equivalent#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)#  define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED#endif////////////////////////////////////////////////////////////////////////////////// DJGPP#ifdef __DJGPP__#  define CATCH_INTERNAL_CONFIG_NO_WCHAR#endif // __DJGPP__////////////////////////////////////////////////////////////////////////////////// Embarcadero C++Build#if defined(__BORLANDC__)    #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN#endif////////////////////////////////////////////////////////////////////////////////// Use of __COUNTER__ is suppressed during code analysis in// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly// handled by it.// Otherwise all supported compilers support COUNTER macro,// but user still might want to turn it off#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L )    #define CATCH_INTERNAL_CONFIG_COUNTER#endif////////////////////////////////////////////////////////////////////////////////// RTX is a special version of Windows that is real time.// This means that it is detected as Windows, but does not provide// the same set of capabilities as real Windows does.#if defined(UNDER_RTSS) || defined(RTX64_BUILD)    #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH    #define CATCH_INTERNAL_CONFIG_NO_ASYNC    #define CATCH_CONFIG_COLOUR_NONE#endif#if !defined(_GLIBCXX_USE_C99_MATH_TR1)#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER#endif// Various stdlib support checks that require __has_include#if defined(__has_include)  // Check if string_view is available and usable  #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)  #    define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW  #endif  // Check if optional is available and usable  #  if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)  #    define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL  #  endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)  // Check if byte is available and usable  #  if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)  #    include <cstddef>  #    if __cpp_lib_byte > 0  #      define CATCH_INTERNAL_CONFIG_CPP17_BYTE  #    endif  #  endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)  // Check if variant is available and usable  #  if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)  #    if defined(__clang__) && (__clang_major__ < 8)         // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852         // fix should be in clang 8, workaround in libstdc++ 8.2  #      include <ciso646>  #      if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)  #        define CATCH_CONFIG_NO_CPP17_VARIANT  #      else  #        define CATCH_INTERNAL_CONFIG_CPP17_VARIANT  #      endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)  #    else  #      define CATCH_INTERNAL_CONFIG_CPP17_VARIANT  #    endif // defined(__clang__) && (__clang_major__ < 8)  #  endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)#endif // defined(__has_include)#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)#   define CATCH_CONFIG_COUNTER#endif#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)#   define CATCH_CONFIG_WINDOWS_SEH#endif// This is set by default, because we assume that unix compilers are posix-signal-compatible by default.#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)#   define CATCH_CONFIG_POSIX_SIGNALS#endif// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions.#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR)#   define CATCH_CONFIG_WCHAR#endif#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)#    define CATCH_CONFIG_CPP11_TO_STRING#endif#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL)#  define CATCH_CONFIG_CPP17_OPTIONAL#endif#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)#  define CATCH_CONFIG_CPP17_STRING_VIEW#endif#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT)#  define CATCH_CONFIG_CPP17_VARIANT#endif#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE)#  define CATCH_CONFIG_CPP17_BYTE#endif#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)#  define CATCH_INTERNAL_CONFIG_NEW_CAPTURE#endif#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)#  define CATCH_CONFIG_NEW_CAPTURE#endif#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)#  define CATCH_CONFIG_DISABLE_EXCEPTIONS#endif#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN)#  define CATCH_CONFIG_POLYFILL_ISNAN#endif#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC)  && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)#  define CATCH_CONFIG_USE_ASYNC#endif#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE)#  define CATCH_CONFIG_ANDROID_LOGWRITE#endif#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)#  define CATCH_CONFIG_GLOBAL_NEXTAFTER#endif// Even if we do not think the compiler has that warning, we still have// to provide a macro that can be used by the code.#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)#   define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION#endif#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)#   define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION#endif#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)#   define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS#endif#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)#   define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS#endif#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)#   define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS#endif#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)#   define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS#endif// The goal of this macro is to avoid evaluation of the arguments, but// still have the compiler warn on problems inside...#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)#   define CATCH_INTERNAL_IGNORE_BUT_WARN(...)#endif#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)#   undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS#elif defined(__clang__) && (__clang_major__ < 5)#   undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS#endif#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS)#   define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS#endif#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)#define CATCH_TRY if ((true))#define CATCH_CATCH_ALL if ((false))#define CATCH_CATCH_ANON(type) if ((false))#else#define CATCH_TRY try#define CATCH_CATCH_ALL catch (...)#define CATCH_CATCH_ANON(type) catch (type)#endif#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR#endif#endif // TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED
 |