mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 22:31:43 +00:00
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.
This commit is contained in:
parent
6943b53023
commit
e5fd550dfd
2 changed files with 26 additions and 1 deletions
|
@ -720,7 +720,13 @@ fn transform_receiver_ty(
|
||||||
.push(self_ty.value.clone())
|
.push(self_ty.value.clone())
|
||||||
.fill_with_unknown()
|
.fill_with_unknown()
|
||||||
.build(),
|
.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!(),
|
AssocContainerId::ContainerId(_) => unreachable!(),
|
||||||
};
|
};
|
||||||
let sig = db.callable_item_signature(function_id.into());
|
let sig = db.callable_item_signature(function_id.into());
|
||||||
|
|
|
@ -1087,3 +1087,22 @@ fn method_resolution_foreign_opaque_type() {
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn method_with_allocator_box_self_type() {
|
||||||
|
check_types(
|
||||||
|
r#"
|
||||||
|
struct Slice<T> {}
|
||||||
|
struct Box<T, A> {}
|
||||||
|
|
||||||
|
impl<T> Slice<T> {
|
||||||
|
pub fn into_vec<A>(self: Box<Self, A>) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let foo: Slice<u32>;
|
||||||
|
(foo.into_vec()); // we don't actually support arbitrary self types, but we shouldn't crash at least
|
||||||
|
} //^ {unknown}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue