From f23b6b8b855b565ade37802d5c8f55012264d94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Thu, 23 Mar 2017 21:11:21 +0100 Subject: [PATCH] Don't sanitize exception type in REQUIRE_THROWS_AS Effectively a revert of previous commit, fixing #542, where this was added to stop linters complaining about `REQUIRE_THROWS_AS` used like `REQUIRE_THROWS_AS(expr, std::exception);`, which would be slicing the caught exception. Now it is user's responsibility to pass us proper exception type. Closes #833 which wanted to add `typename`, so that the construct works in a template, but that would not work with MSVC and older GCC's, as having `typename` outside of a template is allowed only from C++11 onward. --- include/internal/catch_capture.hpp | 3 +-- projects/SelfTest/CompilationTests.cpp | 27 ++++++++++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/include/internal/catch_capture.hpp b/include/internal/catch_capture.hpp index 8499a551..87f78f4e 100644 --- a/include/internal/catch_capture.hpp +++ b/include/internal/catch_capture.hpp @@ -16,7 +16,6 @@ #include "catch_tostring.h" #include "catch_interfaces_runner.h" #include "catch_compiler_capabilities.h" -#include "catch_type_traits.hpp" #if defined(CATCH_CONFIG_FAST_COMPILE) @@ -128,7 +127,7 @@ static_cast(expr); \ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ } \ - catch( Catch::add_const::type>::type ) { \ + catch( exceptionType ) { \ __catchResult.captureResult( Catch::ResultWas::Ok ); \ } \ catch( ... ) { \ diff --git a/projects/SelfTest/CompilationTests.cpp b/projects/SelfTest/CompilationTests.cpp index 635c62c8..4aa969f3 100644 --- a/projects/SelfTest/CompilationTests.cpp +++ b/projects/SelfTest/CompilationTests.cpp @@ -23,20 +23,31 @@ TEST_CASE("#809") { REQUIRE(42 == f); } -// ------------------------------------------------------------------ -// REQUIRE_THROWS_AS was changed to catch exceptions by const& -// using type traits. This means that this should compile cleanly -// Provides indirection to prevent unreachable-code warnings +// ------------------------------------------------------------------ +// Changes to REQUIRE_THROWS_AS made it stop working in a template in +// an unfixable way (as long as C++03 compatibility is being kept). +// To prevent these from happening in the future, this needs to compile + void throws_int(bool b) { if (b) { throw 1; } } -TEST_CASE("#542") { - CHECK_THROWS_AS(throws_int(true), int); - CHECK_THROWS_AS(throws_int(true), int&); - CHECK_THROWS_AS(throws_int(true), const int); +template +bool templated_tests(T t) { + int a = 3; + REQUIRE(a == t); + CHECK(a == t); + REQUIRE_THROWS(throws_int(true)); CHECK_THROWS_AS(throws_int(true), const int&); + REQUIRE_NOTHROW(throws_int(false)); + REQUIRE_THAT("aaa", Catch::EndsWith("aaa")); + return true; } + +TEST_CASE("#833") { + REQUIRE(templated_tests(3)); +} +