Refactor CATCH_TRAP selection logic to prefer compiler-specific impls

Primarily this means that with Clang we use `__builtin_debugtrap`
if available.
This commit is contained in:
Martin Hořeňovský
2025-08-07 18:17:51 +02:00
parent bcd4116df7
commit 9a3d68315b

View File

@@ -14,6 +14,17 @@ namespace Catch {
bool isDebuggerActive(); bool isDebuggerActive();
} }
#if !defined( CATCH_TRAP ) && defined( __clang__ ) && defined( __has_builtin )
# if __has_builtin( __builtin_debugtrap )
# define CATCH_TRAP() __builtin_debugtrap()
# endif
#endif
#if !defined( CATCH_TRAP ) && defined( _MSC_VER )
# define CATCH_TRAP() __debugbreak()
#endif
#if !defined(CATCH_TRAP) // If we couldn't use compiler-specific impl from above, we get into platform-specific options
#ifdef CATCH_PLATFORM_MAC #ifdef CATCH_PLATFORM_MAC
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
@@ -49,15 +60,15 @@ namespace Catch {
#define CATCH_TRAP() raise(SIGTRAP) #define CATCH_TRAP() raise(SIGTRAP)
#endif #endif
#elif defined(_MSC_VER)
#define CATCH_TRAP() __debugbreak()
#elif defined(__MINGW32__) #elif defined(__MINGW32__)
extern "C" __declspec(dllimport) void __stdcall DebugBreak(); extern "C" __declspec(dllimport) void __stdcall DebugBreak();
#define CATCH_TRAP() DebugBreak() #define CATCH_TRAP() DebugBreak()
#endif #endif
#endif // ^^ CATCH_TRAP is not defined yet, so we define it
#ifndef CATCH_BREAK_INTO_DEBUGGER
#ifdef CATCH_TRAP #if !defined(CATCH_BREAK_INTO_DEBUGGER)
#if defined(CATCH_TRAP)
#define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }() #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }()
#else #else
#define CATCH_BREAK_INTO_DEBUGGER() []{}() #define CATCH_BREAK_INTO_DEBUGGER() []{}()