From 77eae8bd2a2c8c3135d30649aa7c51b5bfc0e61e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Tue, 7 Apr 2026 13:35:57 +0200 Subject: [PATCH] Turn IResultCapture::lastAssertionPassed into a free function The thread-safety changes in assertions & messages turned whether the last assertion passed or failed into thread-local state, instead of being member of the `RunContext`. However, this change was not reflected in the API `CHECKED_IF`/`CHECKED_ELSE` used, which in turn required `catch_test_macro_impl.hpp` to include `catch_interfaces_capture.hpp` for it. Thanks to the combination of this commit and the previous similar commit for the message stack handling, the main include path does not need to include `catch_interfaces_capture.hpp` anymore. --- src/catch2/interfaces/catch_interfaces_capture.hpp | 4 ---- src/catch2/internal/catch_run_context.cpp | 8 +++----- src/catch2/internal/catch_run_context.hpp | 2 -- src/catch2/internal/catch_test_macro_impl.hpp | 12 +++++++++--- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/catch2/interfaces/catch_interfaces_capture.hpp b/src/catch2/interfaces/catch_interfaces_capture.hpp index b67437b1..4484e864 100644 --- a/src/catch2/interfaces/catch_interfaces_capture.hpp +++ b/src/catch2/interfaces/catch_interfaces_capture.hpp @@ -61,7 +61,6 @@ namespace Catch { virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0; virtual void benchmarkFailed( StringRef error ) = 0; - virtual void handleFatalErrorCondition( StringRef message ) = 0; virtual void handleExpr @@ -87,9 +86,6 @@ namespace Catch { ResultWas::OfType resultType, AssertionReaction &reaction ) = 0; - - virtual bool lastAssertionPassed() = 0; - // Deprecated, do not use: virtual std::string getCurrentTestName() const = 0; virtual const AssertionResult* getLastResult() const = 0; diff --git a/src/catch2/internal/catch_run_context.cpp b/src/catch2/internal/catch_run_context.cpp index 125ffc7b..547ff9d8 100644 --- a/src/catch2/internal/catch_run_context.cpp +++ b/src/catch2/internal/catch_run_context.cpp @@ -324,6 +324,9 @@ namespace Catch { void addUnscopedMessage( MessageInfo&& message ) { Detail::g_messageHolder().addUnscopedMessage( CATCH_MOVE( message ) ); } + + bool lastAssertionPassed() { return Detail::g_lastAssertionPassed; } + } // namespace Detail RunContext::RunContext(IConfig const* _config, IEventListenerPtr&& reporter) @@ -720,10 +723,6 @@ namespace Catch { m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false)); } - bool RunContext::lastAssertionPassed() { - return Detail::g_lastAssertionPassed; - } - void RunContext::assertionPassedFastPath(SourceLineInfo lineInfo) { // We want to save the line info for better experience with unexpected assertions Detail::g_lastKnownLineInfo = lineInfo; @@ -953,7 +952,6 @@ namespace Catch { } } - void seedRng(IConfig const& config) { sharedRng().seed(config.rngSeed()); } diff --git a/src/catch2/internal/catch_run_context.hpp b/src/catch2/internal/catch_run_context.hpp index dee851e0..4a77cac5 100644 --- a/src/catch2/internal/catch_run_context.hpp +++ b/src/catch2/internal/catch_run_context.hpp @@ -102,8 +102,6 @@ namespace Catch { void handleFatalErrorCondition( StringRef message ) override; - bool lastAssertionPassed() override; - public: // !TBD We need to do this another way! bool aborting() const; diff --git a/src/catch2/internal/catch_test_macro_impl.hpp b/src/catch2/internal/catch_test_macro_impl.hpp index ccd5bb35..f38ec606 100644 --- a/src/catch2/internal/catch_test_macro_impl.hpp +++ b/src/catch2/internal/catch_test_macro_impl.hpp @@ -11,10 +11,16 @@ #include #include #include -#include #include #include +namespace Catch { + namespace Detail { + // Defined in catch_run_context.cpp, where the thread-local data lives. + bool lastAssertionPassed(); + } +} + // We need this suppression to leak, because it took until GCC 10 // for the front end to handle local suppression via _Pragma properly #if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && __GNUC__ <= 9 @@ -57,12 +63,12 @@ /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \ INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ - if( Catch::getResultCapture().lastAssertionPassed() ) + if( Catch::Detail::lastAssertionPassed() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \ INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ - if( !Catch::getResultCapture().lastAssertionPassed() ) + if( !Catch::Detail::lastAssertionPassed() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \