From 9ecbadcedb4971d29c34453b010899ec0e336e2d Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 16 Jun 2020 22:45:34 +0200 Subject: Fix index-out-of-bounds panic in match checking --- crates/ra_hir_ty/src/_match.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir_ty/src/_match.rs') diff --git a/crates/ra_hir_ty/src/_match.rs b/crates/ra_hir_ty/src/_match.rs index fff257193..42004282c 100644 --- a/crates/ra_hir_ty/src/_match.rs +++ b/crates/ra_hir_ty/src/_match.rs @@ -362,7 +362,12 @@ impl PatStack { cx: &MatchCheckCtx, constructor: &Constructor, ) -> MatchCheckResult> { - let result = match (self.head().as_pat(cx), constructor) { + if self.is_empty() { + return Ok(None); + } + + let head_pat = self.head().as_pat(cx); + let result = match (head_pat, constructor) { (Pat::Tuple { args: ref pat_ids, ellipsis }, Constructor::Tuple { arity: _ }) => { if ellipsis.is_some() { // If there are ellipsis here, we should add the correct number of @@ -531,7 +536,7 @@ impl Matrix { } fn heads(&self) -> Vec { - self.0.iter().map(|p| p.head()).collect() + self.0.iter().flat_map(|p| p.get_head()).collect() } /// Computes `D(self)` for each contained PatStack. @@ -1992,6 +1997,25 @@ mod tests { check_no_diagnostic(content); } + + #[test] + fn or_pattern_panic() { + let content = r" + pub enum Category { + Infinity, + Zero, + } + + fn panic(a: Category, b: Category) { + match (a, b) { + (Category::Zero | Category::Infinity, _) => {} + (_, Category::Zero | Category::Infinity) => {} + } + } + "; + + check_no_diagnostic(content); + } } #[cfg(test)] -- cgit v1.2.3