summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-09-04 16:15:46 +0800
committerJohn Hodge <tpg@mutabah.net>2016-09-04 16:15:46 +0800
commit1a6e144f8311faf6e6feaced2115ac00ae23d555 (patch)
treebe253efcd77ce82a81c943636a094d7cce8ab5ca /src
parent2d58f74a1453646f330f4c83c1a421429bf6fc9e (diff)
downloadmrust-1a6e144f8311faf6e6feaced2115ac00ae23d555.tar.gz
HIR Typecheck Expr - Magic Unsize impl for array->slice
Diffstat (limited to 'src')
-rw-r--r--src/hir_typeck/helpers.cpp17
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,