diff --git a/crates/ra_hir_ty/src/_match.rs b/crates/ra_hir_ty/src/_match.rs index fff2571932..42004282c7 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)]