From e5fd550dfdc7b67e22b0889983c5698439dc0bd5 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 4 Dec 2020 18:41:37 +0100 Subject: Use correct, full substs for self type in impl Without arbitrary self types, the self type could never refer to the method type parameters, so this wasn't a problem; but with arbitrary self types, it can. This fixes the crash from #6668; but it doesn't make method resolution work for these methods. --- crates/hir_ty/src/method_resolution.rs | 8 +++++++- crates/hir_ty/src/tests/method_resolution.rs | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'crates/hir_ty') diff --git a/crates/hir_ty/src/method_resolution.rs b/crates/hir_ty/src/method_resolution.rs index 5a6f0c67f..8a289f52a 100644 --- a/crates/hir_ty/src/method_resolution.rs +++ b/crates/hir_ty/src/method_resolution.rs @@ -720,7 +720,13 @@ fn transform_receiver_ty( .push(self_ty.value.clone()) .fill_with_unknown() .build(), - AssocContainerId::ImplId(impl_id) => inherent_impl_substs(db, impl_id, &self_ty)?, + AssocContainerId::ImplId(impl_id) => { + let impl_substs = inherent_impl_substs(db, impl_id, &self_ty)?; + Substs::build_for_def(db, function_id) + .use_parent_substs(&impl_substs) + .fill_with_unknown() + .build() + } AssocContainerId::ContainerId(_) => unreachable!(), }; let sig = db.callable_item_signature(function_id.into()); diff --git a/crates/hir_ty/src/tests/method_resolution.rs b/crates/hir_ty/src/tests/method_resolution.rs index 0f17ff151..a6a54e542 100644 --- a/crates/hir_ty/src/tests/method_resolution.rs +++ b/crates/hir_ty/src/tests/method_resolution.rs @@ -1087,3 +1087,22 @@ fn method_resolution_foreign_opaque_type() { "#]], ); } + +#[test] +fn method_with_allocator_box_self_type() { + check_types( + r#" +struct Slice {} +struct Box {} + +impl Slice { + pub fn into_vec(self: Box) { } +} + +fn main() { + let foo: Slice; + (foo.into_vec()); // we don't actually support arbitrary self types, but we shouldn't crash at least +} //^ {unknown} +"#, + ); +} -- cgit v1.2.3