summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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,