Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/lower/pattern_matching.rs')
| -rw-r--r-- | crates/hir-ty/src/mir/lower/pattern_matching.rs | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/crates/hir-ty/src/mir/lower/pattern_matching.rs b/crates/hir-ty/src/mir/lower/pattern_matching.rs index e7fa036f23..c924c5bdf0 100644 --- a/crates/hir-ty/src/mir/lower/pattern_matching.rs +++ b/crates/hir-ty/src/mir/lower/pattern_matching.rs @@ -248,9 +248,18 @@ impl<'db> MirLowerCtx<'_, 'db> { (current, current_else) } Pat::Slice { prefix, slice, suffix } => { + let pat_ty = self.infer.pat_ty(pattern); + // FIXME: MIR lowering should be skipped for bodies with inference errors. Once + // that happens, this recovery for invalid slice patterns can be removed. + if !matches!(pat_ty.kind(), TyKind::Array(..) | TyKind::Slice(_)) { + return Err(MirLowerError::TypeError( + "non array or slice type matched with slice pattern", + )); + } + if mode == MatchingMode::Check { // emit runtime length check for slice - if let TyKind::Slice(_) = self.infer.pat_ty(pattern).kind() { + if let TyKind::Slice(_) = pat_ty.kind() { let pattern_len = prefix.len() + suffix.len(); let place_len: Place = self .temp(Ty::new_usize(self.interner()), current, pattern.into())? |