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.
This commit is contained in:
Martin Hořeňovský 2017-03-23 21:11:21 +01:00
parent 4597b43912
commit f23b6b8b85
2 changed files with 20 additions and 10 deletions

View File

@ -16,7 +16,6 @@
#include "catch_tostring.h" #include "catch_tostring.h"
#include "catch_interfaces_runner.h" #include "catch_interfaces_runner.h"
#include "catch_compiler_capabilities.h" #include "catch_compiler_capabilities.h"
#include "catch_type_traits.hpp"
#if defined(CATCH_CONFIG_FAST_COMPILE) #if defined(CATCH_CONFIG_FAST_COMPILE)
@ -128,7 +127,7 @@
static_cast<void>(expr); \ static_cast<void>(expr); \
__catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \ __catchResult.captureResult( Catch::ResultWas::DidntThrowException ); \
} \ } \
catch( Catch::add_const<Catch::add_lvalue_reference<exceptionType>::type>::type ) { \ catch( exceptionType ) { \
__catchResult.captureResult( Catch::ResultWas::Ok ); \ __catchResult.captureResult( Catch::ResultWas::Ok ); \
} \ } \
catch( ... ) { \ catch( ... ) { \

View File

@ -23,20 +23,31 @@ TEST_CASE("#809") {
REQUIRE(42 == f); 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) { void throws_int(bool b) {
if (b) { if (b) {
throw 1; throw 1;
} }
} }
TEST_CASE("#542") { template <typename T>
CHECK_THROWS_AS(throws_int(true), int); bool templated_tests(T t) {
CHECK_THROWS_AS(throws_int(true), int&); int a = 3;
CHECK_THROWS_AS(throws_int(true), const int); REQUIRE(a == t);
CHECK(a == t);
REQUIRE_THROWS(throws_int(true));
CHECK_THROWS_AS(throws_int(true), const int&); 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<int>(3));
}