Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir_ty/src/diagnostics/match_check.rs')
| -rw-r--r-- | crates/hir_ty/src/diagnostics/match_check.rs | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/crates/hir_ty/src/diagnostics/match_check.rs b/crates/hir_ty/src/diagnostics/match_check.rs index fdf448f5e1..87a8579761 100644 --- a/crates/hir_ty/src/diagnostics/match_check.rs +++ b/crates/hir_ty/src/diagnostics/match_check.rs @@ -11,8 +11,11 @@ pub(crate) mod deconstruct_pat; pub(crate) mod usefulness; use hir_def::{body::Body, expr::PatId, EnumVariantId, LocalFieldId, VariantId}; +use stdx::never; -use crate::{db::HirDatabase, InferenceResult, Interner, Substitution, Ty, TyKind}; +use crate::{ + db::HirDatabase, infer::BindingMode, InferenceResult, Interner, Substitution, Ty, TyKind, +}; use self::pat_util::EnumerateAndAdjustIterator; @@ -21,6 +24,7 @@ pub(crate) use self::usefulness::MatchArm; #[derive(Clone, Debug)] pub(crate) enum PatternError { Unimplemented, + UnexpectedType, UnresolvedVariant, MissingField, ExtraFields, @@ -129,9 +133,16 @@ impl<'a> PatCtxt<'a> { PatKind::Leaf { subpatterns } } - hir_def::expr::Pat::Bind { subpat, .. } => { - if let TyKind::Ref(.., rty) = ty.kind(Interner) { - ty = rty; + hir_def::expr::Pat::Bind { ref name, subpat, .. } => { + let bm = self.infer.pat_binding_modes[&pat]; + match (bm, ty.kind(Interner)) { + (BindingMode::Ref(_), TyKind::Ref(.., rty)) => ty = rty, + (BindingMode::Ref(_), _) => { + never!("`ref {}` has wrong type {:?}", name, ty); + self.errors.push(PatternError::UnexpectedType); + return Pat { ty: ty.clone(), kind: PatKind::Wild.into() }; + } + _ => (), } PatKind::Binding { subpattern: self.lower_opt_pattern(subpat) } } |