Cleanup a bulky expression, document implementation details

This commit is contained in:
Vladimir Goncharov 2020-07-13 20:22:55 +03:00
parent 4ebbfea623
commit a899cecb11

View File

@ -4741,6 +4741,35 @@ class ExceptionMatcherImpl {
} }
}; };
// If the matchee raises an exception of a wrong type, we'd like to
// catch it and print its message and type. To do that, we add an additional
// catch clause:
//
// try { ... }
// catch (const Err&) { /* an expected exception */ }
// catch (const std::exception&) { /* exception of a wrong type */ }
//
// However, if the `Err` itself is `std::exception`, we'd end up with two
// identical `catch` clauses:
//
// try { ... }
// catch (const std::exception&) { /* an expected exception */ }
// catch (const std::exception&) { /* exception of a wrong type */ }
//
// This can cause a warning or an error in some compilers. To resolve
// the issue, we use a fake error type whenever `Err` is `std::exception`:
//
// try { ... }
// catch (const std::exception&) { /* an expected exception */ }
// catch (const NeverThrown&) { /* exception of a wrong type */ }
using DefaultExceptionType = typename std::conditional<
std::is_same<
typename std::remove_cv<
typename std::remove_reference<Err>::type>::type,
std::exception>::value,
const NeverThrown&,
const std::exception&>::type;
public: public:
ExceptionMatcherImpl(Matcher<const Err&> matcher) ExceptionMatcherImpl(Matcher<const Err&> matcher)
: matcher_(std::move(matcher)) {} : matcher_(std::move(matcher)) {}
@ -4771,14 +4800,7 @@ class ExceptionMatcherImpl {
} else { } else {
return true; return true;
} }
} catch ( } catch (DefaultExceptionType err) {
typename std::conditional<
std::is_same<
typename std::remove_cv<
typename std::remove_reference<Err>::type>::type,
std::exception>::value,
const NeverThrown&,
const std::exception&>::type const& err) {
#if GTEST_HAS_RTTI #if GTEST_HAS_RTTI
*listener << "throws an exception of type " *listener << "throws an exception of type "
<< GetTypeName(typeid(err)) << " "; << GetTypeName(typeid(err)) << " ";