Cleanup a bulky expression, document implementation details
This commit is contained in:
		@@ -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)) << " ";
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user