diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-04 16:15:46 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-04 16:15:46 +0800 |
commit | 1a6e144f8311faf6e6feaced2115ac00ae23d555 (patch) | |
tree | be253efcd77ce82a81c943636a094d7cce8ab5ca /src | |
parent | 2d58f74a1453646f330f4c83c1a421429bf6fc9e (diff) | |
download | mrust-1a6e144f8311faf6e6feaced2115ac00ae23d555.tar.gz |
HIR Typecheck Expr - Magic Unsize impl for array->slice
Diffstat (limited to 'src')
-rw-r--r-- | src/hir_typeck/helpers.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/hir_typeck/helpers.cpp b/src/hir_typeck/helpers.cpp index bdd287a6..14f1559f 100644 --- a/src/hir_typeck/helpers.cpp +++ b/src/hir_typeck/helpers.cpp @@ -1087,8 +1087,25 @@ bool TraitResolution::find_trait_impls(const Span& sp, */ return false; } + + // Unsize impl for arrays + if( trait == m_crate.get_lang_item_path(sp, "unsize") ) + { + ASSERT_BUG(sp, params.m_types.size() == 1, ""); + const auto& dst_ty = m_ivars.get_type( params.m_types[0] ); + + TU_IFLET(::HIR::TypeRef::Data, dst_ty.m_data, Slice, e2, + auto cmp = e.inner->compare_with_placeholders(sp, *e2.inner, m_ivars.callback_resolve_infer()); + if( cmp != ::HIR::Compare::Unequal ) { + ::HIR::PathParams pp; + pp.m_types.push_back( e.inner->clone() ); + return callback( ImplRef(type.clone(), mv$(pp), {}), cmp ); + } + ) + } ) + // Trait objects automatically implement their own traits // - IF object safe (TODO) TU_IFLET(::HIR::TypeRef::Data, type.m_data, TraitObject, e, |