diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 879124502a..ed1776640c 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -2504,9 +2504,8 @@ impl Type { pub fn autoderef<'a>(&'a self, db: &'a dyn HirDatabase) -> impl Iterator + 'a { // There should be no inference vars in types passed here - // FIXME check that? - let canonical = - Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; + let ty = hir_ty::replace_errors_with_variables(&self.ty).value; + let canonical = Canonical { value: ty, binders: CanonicalVarKinds::empty(&Interner) }; let environment = self.env.env.clone(); let ty = InEnvironment { goal: canonical, environment }; autoderef(db, Some(self.krate), ty) @@ -2600,10 +2599,7 @@ impl Type { callback: &mut dyn FnMut(&Ty, AssocItemId) -> ControlFlow<()>, ) { // There should be no inference vars in types passed here - // FIXME check that? - // FIXME replace Unknown by bound vars here - let canonical = - Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; + let canonical = hir_ty::replace_errors_with_variables(&self.ty); let env = self.env.clone(); let krate = krate.id; diff --git a/crates/ide_completion/src/completions/dot.rs b/crates/ide_completion/src/completions/dot.rs index 94a5ebabf9..213cb70170 100644 --- a/crates/ide_completion/src/completions/dot.rs +++ b/crates/ide_completion/src/completions/dot.rs @@ -697,4 +697,26 @@ fn f() { "#]], ); } + + #[test] + fn completes_method_call_when_receiver_type_has_errors_issue_10297() { + check( + r#" +//- minicore: iterator, sized +struct Vec; +impl IntoIterator for Vec { + type Item = (); + type IntoIter = (); + fn into_iter(self); +} +fn main() { + let x: Vec<_>; + x.$0; +} +"#, + expect![[r#" + me into_iter() (as IntoIterator) fn(self) -> ::IntoIter + "#]], + ) + } }