diff options
| author | John Hodge <tpg@mutabah.net> | 2016-07-07 05:40:41 +1000 | 
|---|---|---|
| committer | John Hodge <tpg@mutabah.net> | 2016-07-07 05:40:41 +1000 | 
| commit | f066bcb98c61febd82ae24498d4fbb71d89e45df (patch) | |
| tree | 164db87f2bebf9174dedc5afa54b00b47a346034 /src | |
| parent | dc7371626369717e3347887a21b69ccb2c338af5 (diff) | |
| download | mrust-f066bcb98c61febd82ae24498d4fbb71d89e45df.tar.gz | |
HIR Typecheck CS - Apply function bounds
Diffstat (limited to 'src')
| -rw-r--r-- | src/hir_typeck/expr_cs.cpp | 40 | 
1 files changed, 40 insertions, 0 deletions
| diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp index 47b2a214..789f8509 100644 --- a/src/hir_typeck/expr_cs.cpp +++ b/src/hir_typeck/expr_cs.cpp @@ -289,6 +289,30 @@ namespace {          }          cache.m_monomorph_cb = mv$(monomorph_cb); +         +        // TODO: Bounds (encoded as associated) +        for(const auto& bound : cache.m_fcn_params->m_bounds) +        { +            TU_MATCH(::HIR::GenericBound, (bound), (be), +            (Lifetime, +                ), +            (TypeLifetime, +                ), +            (TraitBound, +                auto real_type = monomorphise_type_with(sp, be.type, cache.m_monomorph_cb); +                auto real_trait = monomorphise_genericpath_with(sp, be.trait.m_path, cache.m_monomorph_cb, false); +                DEBUG("Bound " << be.type << ":  " << be.trait); +                DEBUG("= (" << real_type << ": " << real_trait << ")"); +                const auto& trait_params = be.trait.m_path.m_params; +                context.equate_types_assoc(sp, ::HIR::TypeRef(), be.trait.m_path.m_path, mv$(trait_params.clone().m_types), real_type, ""); +                ), +            (TypeEquality, +                auto real_type_left = context.m_resolve.expand_associated_types(sp, monomorphise_type_with(sp, be.type, cache.m_monomorph_cb)); +                auto real_type_right = context.m_resolve.expand_associated_types(sp, monomorphise_type_with(sp, be.other_type, cache.m_monomorph_cb)); +                context.equate_types(sp, real_type_left, real_type_right); +                ) +            ) +        }      }      // ----------------------------------------------------------------------- @@ -1371,6 +1395,22 @@ namespace {              {                  DEBUG("- deref_count = " << deref_count);                  visit_call_populate_cache(this->context, node.span(), fcn_path, node.m_cache); +                 +                node.m_method_path = mv$(fcn_path); +                // NOTE: Steals the params from the node +                TU_MATCH(::HIR::Path::Data, (node.m_method_path.m_data), (e), +                (Generic, +                    ), +                (UfcsUnknown, +                    ), +                (UfcsKnown, +                    e.params = mv$(node.m_params); +                    ), +                (UfcsInherent, +                    e.params = mv$(node.m_params); +                    ) +                ) +                                  assert( node.m_cache.m_arg_types.size() >= 1);                  if( node.m_args.size()+1 != node.m_cache.m_arg_types.size() - 1 ) { | 
