mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	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:
		| @@ -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( ... ) { \ | ||||||
|   | |||||||
| @@ -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)); | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský