Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
catch_compiler_capabilities.h
Go to the documentation of this file.
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
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
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
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
94// Not all Windows environments support SEH properly
95#if defined(__MINGW32__)
96# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
97#endif
98
100// PS4
101#if defined(__ORBIS__)
102# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE
103#endif
104
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
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
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
155// DJGPP
156#ifdef __DJGPP__
157# define CATCH_INTERNAL_CONFIG_NO_WCHAR
158#endif // __DJGPP__
159
161// Embarcadero C++Build
162#if defined(__BORLANDC__)
163 #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN
164#endif
165
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
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
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
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