diff --git a/include/internal/catch_assertionhandler.cpp b/include/internal/catch_assertionhandler.cpp index 3465269f..60f97617 100644 --- a/include/internal/catch_assertionhandler.cpp +++ b/include/internal/catch_assertionhandler.cpp @@ -61,7 +61,7 @@ namespace Catch { getCurrentContext().getResultCapture()->assertionStarting( m_assertionInfo ); } AssertionHandler::~AssertionHandler() { - if ( m_inExceptionGuard ) { + if ( !m_handled ) { handle( ResultWas::ThrewException, "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE" ); getCurrentContext().getResultCapture()->exceptionEarlyReported(); } @@ -76,6 +76,7 @@ namespace Catch { { getCurrentContext().getResultCapture()->assertionRun(); getCurrentContext().getResultCapture()->assertionPassed(); + m_handled = true; return; } @@ -95,6 +96,7 @@ namespace Catch { } void AssertionHandler::handle( AssertionResultData const& resultData, ITransientExpression const* expr ) { + m_handled = true; getResultCapture().assertionRun(); AssertionResult assertionResult{ m_assertionInfo, resultData }; @@ -136,15 +138,6 @@ namespace Catch { handle( ResultWas::ThrewException, Catch::translateActiveException() ); } - void AssertionHandler::setExceptionGuard() { - assert( m_inExceptionGuard == false ); - m_inExceptionGuard = true; - } - void AssertionHandler::unsetExceptionGuard() { - assert( m_inExceptionGuard == true ); - m_inExceptionGuard = false; - } - // This is the overload that takes a string and infers the Equals matcher from it // The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef matcherString ) { diff --git a/include/internal/catch_assertionhandler.h b/include/internal/catch_assertionhandler.h index 9fdbee4f..a800af5c 100644 --- a/include/internal/catch_assertionhandler.h +++ b/include/internal/catch_assertionhandler.h @@ -36,7 +36,7 @@ namespace Catch { AssertionInfo m_assertionInfo; bool m_shouldDebugBreak = false; bool m_shouldThrow = false; - bool m_inExceptionGuard = false; + bool m_handled = false; public: AssertionHandler @@ -62,8 +62,6 @@ namespace Catch { void reactWithDebugBreak() const; void reactWithoutDebugBreak() const; void useActiveException(); - void setExceptionGuard(); - void unsetExceptionGuard(); }; void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef matcherString ); diff --git a/include/internal/catch_capture.hpp b/include/internal/catch_capture.hpp index e0613487..d7c322ba 100644 --- a/include/internal/catch_capture.hpp +++ b/include/internal/catch_capture.hpp @@ -34,8 +34,8 @@ // macros. // This can potentially cause false negative, if the test code catches // the exception before it propagates back up to the runner. -#define INTERNAL_CATCH_TRY( capturer ) capturer.setExceptionGuard(); -#define INTERNAL_CATCH_CATCH( capturer ) capturer.unsetExceptionGuard(); +#define INTERNAL_CATCH_TRY +#define INTERNAL_CATCH_CATCH( capturer ) #else // CATCH_CONFIG_FAST_COMPILE @@ -48,7 +48,7 @@ if( handler.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ handler.reactWithoutDebugBreak(); -#define INTERNAL_CATCH_TRY( capturer ) try +#define INTERNAL_CATCH_TRY try #define INTERNAL_CATCH_CATCH( capturer ) catch(...) { capturer.useActiveException(); } #endif @@ -57,7 +57,7 @@ #define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ - INTERNAL_CATCH_TRY( catchAssertionHandler ) { \ + INTERNAL_CATCH_TRY { \ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ catchAssertionHandler.handle( Catch::Decomposer() <= __VA_ARGS__ ); \ CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ diff --git a/include/internal/catch_capture_matchers.h b/include/internal/catch_capture_matchers.h index cce61747..9cbcb21d 100644 --- a/include/internal/catch_capture_matchers.h +++ b/include/internal/catch_capture_matchers.h @@ -59,7 +59,7 @@ namespace Catch { #define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ - INTERNAL_CATCH_TRY( catchAssertionHandler ) { \ + INTERNAL_CATCH_TRY { \ catchAssertionHandler.handle( Catch::makeMatchExpr( arg, matcher, #matcher ) ); \ } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \