summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-09-03 14:59:48 +0800
committerJohn Hodge <tpg@mutabah.net>2016-09-03 14:59:48 +0800
commitdbf5ab5257fa4535585fb41794b6a86a5c74d637 (patch)
tree232573b7ad37fb8eeced897377de45e4ddd740e6 /src
parentc9442608f88bb841660aa9358b42f3fc9729c72f (diff)
downloadmrust-dbf5ab5257fa4535585fb41794b6a86a5c74d637.tar.gz
HIR Typecheck - Search for type impls in other crates too
Diffstat (limited to 'src')
-rw-r--r--src/hir_typeck/expr_cs.cpp1
-rw-r--r--src/hir_typeck/helpers.cpp46
2 files changed, 25 insertions, 22 deletions
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index eff5cc53..194834a8 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -341,6 +341,7 @@ namespace {
// TODO: Either - Don't include the above impl bound, or change the below trait to the one that has that type
for( const auto& assoc : be.trait.m_type_bounds ) {
::HIR::GenericPath type_trait_path;
+ ASSERT_BUG(sp, be.trait.m_trait_ptr, "Trait pointer not set in " << be.trait.m_path);
context.m_resolve.trait_contains_type(sp, real_trait, *be.trait.m_trait_ptr, assoc.first, type_trait_path);
auto other_ty = monomorphise_type_with(sp, assoc.second, cache.m_monomorph_cb, true);
diff --git a/src/hir_typeck/helpers.cpp b/src/hir_typeck/helpers.cpp
index 6d382409..ec62bcfe 100644
--- a/src/hir_typeck/helpers.cpp
+++ b/src/hir_typeck/helpers.cpp
@@ -2220,31 +2220,33 @@ bool TraitResolution::find_method(const Span& sp, const HIR::t_trait_list& trait
}
else {
// 2. Search for inherent methods
- for(const auto& impl : m_crate.m_type_impls)
- {
- if( impl.matches_type(ty) ) {
- auto it = impl.m_methods.find( method_name );
- if( it == impl.m_methods.end() )
- continue ;
- const ::HIR::Function& fcn = it->second.data;
- switch(fcn.m_receiver)
- {
- case ::HIR::Function::Receiver::Free:
+ bool rv = m_crate.find_type_impls(ty, m_ivars.callback_resolve_infer(), [&](const auto& impl) {
+ auto it = impl.m_methods.find( method_name );
+ if( it == impl.m_methods.end() )
+ return false ;
+ const ::HIR::Function& fcn = it->second.data;
+ switch(fcn.m_receiver)
+ {
+ case ::HIR::Function::Receiver::Free:
+ break;
+ case ::HIR::Function::Receiver::Value:
+ if( !allow_move )
break;
- case ::HIR::Function::Receiver::Value:
- if( !allow_move )
- break;
- default:
- DEBUG("Matching `impl" << impl.m_params.fmt_args() << " " << impl.m_type << "`"/* << " - " << top_ty*/);
- fcn_path = ::HIR::Path( ::HIR::Path::Data::make_UfcsInherent({
- box$(ty.clone()),
- method_name,
- {}
- }) );
- return true;
- }
+ default:
+ DEBUG("Matching `impl" << impl.m_params.fmt_args() << " " << impl.m_type << "`"/* << " - " << top_ty*/);
+ fcn_path = ::HIR::Path( ::HIR::Path::Data::make_UfcsInherent({
+ box$(ty.clone()),
+ method_name,
+ {}
+ }) );
+ return true;
}
+ return false;
+ });
+ if( rv ) {
+ return true;
}
+
// 3. Search for trait methods (using currently in-scope traits)
for(const auto& trait_ref : ::reverse(traits))
{