From 0a8c30a96fe09047da07a8e2980baa47a334a3d7 Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Wed, 2 Jun 2021 01:29:07 +0500 Subject: internal: implement pattern adjustments. --- crates/hir_ty/src/infer/pat.rs | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'crates/hir_ty/src/infer/pat.rs') diff --git a/crates/hir_ty/src/infer/pat.rs b/crates/hir_ty/src/infer/pat.rs index 83e0a7a9e..a21f44d6a 100644 --- a/crates/hir_ty/src/infer/pat.rs +++ b/crates/hir_ty/src/infer/pat.rs @@ -101,7 +101,9 @@ impl<'a> InferenceContext<'a> { let mut expected = self.resolve_ty_shallow(expected); if is_non_ref_pat(&body, pat) { + let mut pat_adjustments = Vec::new(); while let Some((inner, _lifetime, mutability)) = expected.as_reference() { + pat_adjustments.push(expected.clone()); expected = self.resolve_ty_shallow(inner); default_bm = match default_bm { BindingMode::Move => BindingMode::Ref(mutability), @@ -109,6 +111,11 @@ impl<'a> InferenceContext<'a> { BindingMode::Ref(Mutability::Mut) => BindingMode::Ref(mutability), } } + + if !pat_adjustments.is_empty() { + pat_adjustments.shrink_to_fit(); + self.result.pat_adjustments.insert(pat, pat_adjustments); + } } else if let Pat::Ref { .. } = &body[pat] { cov_mark::hit!(match_ergonomics_ref); // When you encounter a `&pat` pattern, reset to Move. -- cgit v1.2.3