Merge pull request #2426 from kuzkry:#2396-postreview

PiperOrigin-RevId: 265785837
This commit is contained in:
Gennadiy Civil 2019-08-27 21:30:41 -04:00
commit d9c55a48ed

View File

@ -133,14 +133,14 @@ class MatcherCastImpl {
// a user-defined conversion from M to T if one exists (assuming M is // a user-defined conversion from M to T if one exists (assuming M is
// a value). // a value).
return CastImpl(polymorphic_matcher_or_value, return CastImpl(polymorphic_matcher_or_value,
bool_constant<std::is_convertible<M, Matcher<T>>::value>(), std::is_convertible<M, Matcher<T>>{},
bool_constant<std::is_convertible<M, T>::value>()); std::is_convertible<M, T>{});
} }
private: private:
template <bool Ignore> template <bool Ignore>
static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value, static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,
bool_constant<true> /* convertible_to_matcher */, std::true_type /* convertible_to_matcher */,
bool_constant<Ignore>) { bool_constant<Ignore>) {
// M is implicitly convertible to Matcher<T>, which means that either // M is implicitly convertible to Matcher<T>, which means that either
// M is a polymorphic matcher or Matcher<T> has an implicit constructor // M is a polymorphic matcher or Matcher<T> has an implicit constructor
@ -157,8 +157,8 @@ class MatcherCastImpl {
// matcher. It's a value of a type implicitly convertible to T. Use direct // matcher. It's a value of a type implicitly convertible to T. Use direct
// initialization to create a matcher. // initialization to create a matcher.
static Matcher<T> CastImpl(const M& value, static Matcher<T> CastImpl(const M& value,
bool_constant<false> /* convertible_to_matcher */, std::false_type /* convertible_to_matcher */,
bool_constant<true> /* convertible_to_T */) { std::true_type /* convertible_to_T */) {
return Matcher<T>(ImplicitCast_<T>(value)); return Matcher<T>(ImplicitCast_<T>(value));
} }
@ -173,8 +173,8 @@ class MatcherCastImpl {
// //
// We don't define this method inline as we need the declaration of Eq(). // We don't define this method inline as we need the declaration of Eq().
static Matcher<T> CastImpl(const M& value, static Matcher<T> CastImpl(const M& value,
bool_constant<false> /* convertible_to_matcher */, std::false_type /* convertible_to_matcher */,
bool_constant<false> /* convertible_to_T */); std::false_type /* convertible_to_T */);
}; };
// This more specialized version is used when MatcherCast()'s argument // This more specialized version is used when MatcherCast()'s argument
@ -3600,8 +3600,8 @@ inline Matcher<T> An() { return A<T>(); }
template <typename T, typename M> template <typename T, typename M>
Matcher<T> internal::MatcherCastImpl<T, M>::CastImpl( Matcher<T> internal::MatcherCastImpl<T, M>::CastImpl(
const M& value, internal::bool_constant<false> /* convertible_to_matcher */, const M& value, std::false_type /* convertible_to_matcher */,
internal::bool_constant<false> /* convertible_to_T */) { std::false_type /* convertible_to_T */) {
return Eq(value); return Eq(value);
} }