1 /* 2 * Created by Phil on 15/04/2013. 3 * Copyright 2013 Two Blue Cubes Ltd. All rights reserved. 4 * 5 * Distributed under the Boost Software License, Version 1.0. (See accompanying 6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 #ifndef TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED 9 #define TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED 10 11 // Detect a number of compiler features - by compiler 12 // The following features are defined: 13 // 14 // CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? 15 // CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? 16 // CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? 17 // CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled? 18 // **************** 19 // Note to maintainers: if new toggles are added please document them 20 // in configuration.md, too 21 // **************** 22 23 // In general each macro has a _NO_<feature name> form 24 // (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature. 25 // Many features, at point of detection, define an _INTERNAL_ macro, so they 26 // can be combined, en-mass, with the _NO_ forms later. 27 28 #include "catch_platform.h" 29 30 #ifdef __cplusplus 31 32 # if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) 33 # define CATCH_CPP14_OR_GREATER 34 # endif 35 36 # if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) 37 # define CATCH_CPP17_OR_GREATER 38 # endif 39 40 #endif 41 42 #if defined(CATCH_CPP17_OR_GREATER) 43 # define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS 44 #endif 45 46 #ifdef __clang__ 47 48 # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 49 _Pragma( "clang diagnostic push" ) \ 50 _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ 51 _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") 52 # define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 53 _Pragma( "clang diagnostic pop" ) 54 55 # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ 56 _Pragma( "clang diagnostic push" ) \ 57 _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) 58 # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ 59 _Pragma( "clang diagnostic pop" ) 60 61 # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ 62 _Pragma( "clang diagnostic push" ) \ 63 _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) 64 # define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \ 65 _Pragma( "clang diagnostic pop" ) 66 67 #endif // __clang__ 68 69 70 //////////////////////////////////////////////////////////////////////////////// 71 // Assume that non-Windows platforms support posix signals by default 72 #if !defined(CATCH_PLATFORM_WINDOWS) 73 #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS 74 #endif 75 76 //////////////////////////////////////////////////////////////////////////////// 77 // We know some environments not to support full POSIX signals 78 #if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) 79 #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS 80 #endif 81 82 #ifdef __OS400__ 83 # define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS 84 # define CATCH_CONFIG_COLOUR_NONE 85 #endif 86 87 //////////////////////////////////////////////////////////////////////////////// 88 // Android somehow still does not support std::to_string 89 #if defined(__ANDROID__) 90 # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING 91 #endif 92 93 //////////////////////////////////////////////////////////////////////////////// 94 // Not all Windows environments support SEH properly 95 #if defined(__MINGW32__) 96 # define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH 97 #endif 98 99 //////////////////////////////////////////////////////////////////////////////// 100 // PS4 101 #if defined(__ORBIS__) 102 # define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE 103 #endif 104 105 //////////////////////////////////////////////////////////////////////////////// 106 // Cygwin 107 #ifdef __CYGWIN__ 108 109 // Required for some versions of Cygwin to declare gettimeofday 110 // see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin 111 # define _BSD_SOURCE 112 // some versions of cygwin (most) do not support std::to_string. Use the libstd check. 113 // https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 114 # if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ 115 && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) 116 117 # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING 118 119 # endif 120 #endif // __CYGWIN__ 121 122 //////////////////////////////////////////////////////////////////////////////// 123 // Visual C++ 124 #ifdef _MSC_VER 125 126 127 # if _MSC_VER >= 1900 // Visual Studio 2015 or newer 128 # define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS 129 # endif 130 131 // Universal Windows platform does not support SEH 132 // Or console colours (or console at all...) 133 # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) 134 # define CATCH_CONFIG_COLOUR_NONE 135 # else 136 # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH 137 # endif 138 139 // MSVC traditional preprocessor needs some workaround for __VA_ARGS__ 140 // _MSVC_TRADITIONAL == 0 means new conformant preprocessor 141 // _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor 142 # if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) 143 # define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 144 # endif 145 146 #endif // _MSC_VER 147 148 //////////////////////////////////////////////////////////////////////////////// 149 // Check if we are compiled with -fno-exceptions or equivalent 150 #if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) 151 # define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED 152 #endif 153 154 //////////////////////////////////////////////////////////////////////////////// 155 // DJGPP 156 #ifdef __DJGPP__ 157 # define CATCH_INTERNAL_CONFIG_NO_WCHAR 158 #endif // __DJGPP__ 159 160 //////////////////////////////////////////////////////////////////////////////// 161 // Embarcadero C++Build 162 #if defined(__BORLANDC__) 163 #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN 164 #endif 165 166 //////////////////////////////////////////////////////////////////////////////// 167 168 // Use of __COUNTER__ is suppressed during code analysis in 169 // CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly 170 // handled by it. 171 // Otherwise all supported compilers support COUNTER macro, 172 // but user still might want to turn it off 173 #if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) 174 #define CATCH_INTERNAL_CONFIG_COUNTER 175 #endif 176 177 //////////////////////////////////////////////////////////////////////////////// 178 // Check if string_view is available and usable 179 // The check is split apart to work around v140 (VS2015) preprocessor issue... 180 #if defined(__has_include) 181 #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER) 182 # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW 183 #endif 184 #endif 185 186 //////////////////////////////////////////////////////////////////////////////// 187 // Check if optional is available and usable 188 #if defined(__has_include) 189 # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) 190 # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL 191 # endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) 192 #endif // __has_include 193 194 //////////////////////////////////////////////////////////////////////////////// 195 // Check if variant is available and usable 196 #if defined(__has_include) 197 # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) 198 # if defined(__clang__) && (__clang_major__ < 8) 199 // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 200 // fix should be in clang 8, workaround in libstdc++ 8.2 201 # include <ciso646> 202 # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) 203 # define CATCH_CONFIG_NO_CPP17_VARIANT 204 # else 205 # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT 206 # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) 207 # else 208 # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT 209 # endif // defined(__clang__) && (__clang_major__ < 8) 210 # endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) 211 #endif // __has_include 212 213 214 #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) 215 # define CATCH_CONFIG_COUNTER 216 #endif 217 #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) 218 # define CATCH_CONFIG_WINDOWS_SEH 219 #endif 220 // This is set by default, because we assume that unix compilers are posix-signal-compatible by default. 221 #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) 222 # define CATCH_CONFIG_POSIX_SIGNALS 223 #endif 224 // This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions. 225 #if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) 226 # define CATCH_CONFIG_WCHAR 227 #endif 228 229 #if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) 230 # define CATCH_CONFIG_CPP11_TO_STRING 231 #endif 232 233 #if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL) 234 # define CATCH_CONFIG_CPP17_OPTIONAL 235 #endif 236 237 #if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) 238 # define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS 239 #endif 240 241 #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) 242 # define CATCH_CONFIG_CPP17_STRING_VIEW 243 #endif 244 245 #if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) 246 # define CATCH_CONFIG_CPP17_VARIANT 247 #endif 248 249 #if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) 250 # define CATCH_INTERNAL_CONFIG_NEW_CAPTURE 251 #endif 252 253 #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) 254 # define CATCH_CONFIG_NEW_CAPTURE 255 #endif 256 257 #if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) 258 # define CATCH_CONFIG_DISABLE_EXCEPTIONS 259 #endif 260 261 #if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) 262 # define CATCH_CONFIG_POLYFILL_ISNAN 263 #endif 264 265 #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) 266 # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS 267 # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS 268 #endif 269 #if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) 270 # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS 271 # define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS 272 #endif 273 #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) 274 # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS 275 # define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS 276 #endif 277 278 #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) 279 #define CATCH_TRY if ((true)) 280 #define CATCH_CATCH_ALL if ((false)) 281 #define CATCH_CATCH_ANON(type) if ((false)) 282 #else 283 #define CATCH_TRY try 284 #define CATCH_CATCH_ALL catch (...) 285 #define CATCH_CATCH_ANON(type) catch (type) 286 #endif 287 288 #if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) 289 #define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 290 #endif 291 292 #endif // TWOBLUECUBES_CATCH_COMPILER_CAPABILITIES_HPP_INCLUDED 293 294