diff options
| author | Martin Hořeňovský | 2026-09-02 20:53:47 +0200 |
|---|---|---|
| committer | Martin Hořeňovský | 2026-09-05 15:24:15 +0200 |
| commit | ace418200064a2467441f565f74ac41cf5884150 (patch) | |
| tree | e4424ad881d8cfff0dd368d99873607c18d4a637 /src/catch2 | |
| parent | d59be347677feae83d352e7a4d7f04082632e9ac (diff) | |
| download | catch3-devel-noexcept-funcs.tar.gz | |
WIP: More noexceptdevel-noexcept-funcs
Diffstat (limited to 'src/catch2')
4 files changed, 21 insertions, 11 deletions
diff --git a/src/catch2/internal/catch_assertion_handler.cpp b/src/catch2/internal/catch_assertion_handler.cpp index e028c371..1bec6d3f 100644 --- a/src/catch2/internal/catch_assertion_handler.cpp +++ b/src/catch2/internal/catch_assertion_handler.cpp @@ -65,7 +65,7 @@ namespace Catch { m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction ); } - void AssertionHandler::handleExceptionThrownAsExpected() { + void AssertionHandler::handleExceptionThrownAsExpected() noexcept { m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); } void AssertionHandler::handleExceptionNotThrownAsExpected() { @@ -82,7 +82,7 @@ namespace Catch { // 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 ) { + void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str ) noexcept { handleExceptionMatchExpr( handler, Matchers::Equals( str ) ); } diff --git a/src/catch2/internal/catch_assertion_handler.hpp b/src/catch2/internal/catch_assertion_handler.hpp index b92b80eb..d7d3719e 100644 --- a/src/catch2/internal/catch_assertion_handler.hpp +++ b/src/catch2/internal/catch_assertion_handler.hpp @@ -55,17 +55,22 @@ namespace Catch { void handleMessage(ResultWas::OfType resultType, std::string&& message); - void handleExceptionThrownAsExpected(); - void handleUnexpectedExceptionNotThrown(); - void handleExceptionNotThrownAsExpected(); - void handleThrowingCallSkipped(); // TODO: // * called from catch (...) blocks in assertions // * doesn't propagate exception - // * Allows the compiler to skip adding more exception edges in catch (...) when it cannot throw + // * Allows the compiler to skip adding more exception edges in catch + // (...) when it cannot throw // * compilation is faster - // * abort on throw inside is fine -> this is called when another exception is called, so it would abort anyway + // * abort on throw inside is fine -> this is called when another + // exception is called, so it would abort anyway void handleUnexpectedInflightException() noexcept; + // TODO: + // * similar reasoning as above, unified comment for both + void handleExceptionThrownAsExpected() noexcept; + + void handleUnexpectedExceptionNotThrown(); + void handleExceptionNotThrownAsExpected(); + void handleThrowingCallSkipped(); void complete(); @@ -73,7 +78,12 @@ namespace Catch { auto allowThrows() const -> bool; }; - void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str ); + // Like the two handlers above, this is only ever called from inside the + // `catch` block of an assertion macro, so an exception escaping it would + // already terminate. Saying so explicitly keeps the compiler from emitting + // a nested exception edge at every expansion of `REQUIRE_THROWS_WITH` and + // friends. + void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str ) noexcept; } // namespace Catch diff --git a/src/catch2/matchers/internal/catch_matchers_impl.cpp b/src/catch2/matchers/internal/catch_matchers_impl.cpp index 41b462e5..6a524ff6 100644 --- a/src/catch2/matchers/internal/catch_matchers_impl.cpp +++ b/src/catch2/matchers/internal/catch_matchers_impl.cpp @@ -16,7 +16,7 @@ namespace Catch { // This is the general overload that takes a any string matcher // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers // the Equals matcher (so the header does not mention matchers) - void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher ) { + void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher ) noexcept { std::string exceptionMessage = Catch::translateActiveException(); MatchExpr<std::string, StringMatcher const&> expr( CATCH_MOVE(exceptionMessage), matcher ); handler.handleExpr( expr ); diff --git a/src/catch2/matchers/internal/catch_matchers_impl.hpp b/src/catch2/matchers/internal/catch_matchers_impl.hpp index 1aa50385..87667b46 100644 --- a/src/catch2/matchers/internal/catch_matchers_impl.hpp +++ b/src/catch2/matchers/internal/catch_matchers_impl.hpp @@ -60,7 +60,7 @@ namespace Catch { using StringMatcher = Matchers::MatcherBase<std::string>; - void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher ); + void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher ) noexcept; template<typename ArgT, typename MatcherT> constexpr MatchExpr<ArgT, MatcherT> |