summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-11-06 12:28:13 +0800
committerJohn Hodge <tpg@mutabah.net>2016-11-06 12:28:13 +0800
commitd10cbaef93aba6192b37871ac1443180ebb2ecb6 (patch)
treedae64d4b1867334d920551b4375c4a4a8a12006b
parent1597717e63a379585905f3e22ba4e0c3da893bd0 (diff)
downloadmrust-d10cbaef93aba6192b37871ac1443180ebb2ecb6.tar.gz
HIR Typecheck Expr - Don't call callback if params failed to match
-rw-r--r--src/hir_typeck/helpers.cpp30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/hir_typeck/helpers.cpp b/src/hir_typeck/helpers.cpp
index 6ad2a314..9a1439b8 100644
--- a/src/hir_typeck/helpers.cpp
+++ b/src/hir_typeck/helpers.cpp
@@ -1319,30 +1319,30 @@ bool TraitResolution::find_trait_impls(const Span& sp,
::HIR::PathParams params_mono_o;
const auto& b_params_mono = (monomorphise_pathparams_needed(b_params) ? params_mono_o = monomorphise_path_params_with(sp, b_params, monomorph_cb, false) : b_params);
- // TODO: find trait in trait.
if( bound.m_path.m_path == trait )
{
- auto cmp = ::HIR::Compare::Equal;
- cmp = this->compare_pp(sp, b_params_mono, params);
-
- if( &b_params_mono == &params_mono_o )
- {
- if( callback( ImplRef(type.clone(), mv$(params_mono_o), {}), cmp ) )
- return true;
- params_mono_o = monomorphise_path_params_with(sp, params, monomorph_cb, false);
- }
- else
+ auto cmp = this->compare_pp(sp, b_params_mono, params);
+ if( cmp != ::HIR::Compare::Unequal )
{
- if( callback( ImplRef(&type, &bound.m_path.m_params, &null_assoc), cmp ) )
- return true;
+ if( &b_params_mono == &params_mono_o )
+ {
+ if( callback( ImplRef(type.clone(), mv$(params_mono_o), {}), cmp ) )
+ return true;
+ params_mono_o = monomorphise_path_params_with(sp, params, monomorph_cb, false);
+ }
+ else
+ {
+ if( callback( ImplRef(&type, &bound.m_path.m_params, &null_assoc), cmp ) )
+ return true;
+ }
}
}
bool ret = this->find_named_trait_in_trait(sp, trait, params, *bound.m_trait_ptr, bound.m_path.m_path, b_params_mono, type,
[&](const auto& i_ty, const auto& i_params, const auto& i_assoc) {
auto cmp = this->compare_pp(sp, i_params, params);
- DEBUG("impl " << trait << i_params << " for " << i_ty << " -- desired " << trait << params);
- return callback( ImplRef(i_ty.clone(), i_params.clone(), {}), cmp );
+ DEBUG("cmp=" << cmp << ", impl " << trait << i_params << " for " << i_ty << " -- desired " << trait << params);
+ return cmp != ::HIR::Compare::Unequal && callback( ImplRef(i_ty.clone(), i_params.clone(), {}), cmp );
});
if( ret )
return true;