Fix index-out-of-bounds panic in match checking
This commit is contained in:
parent
5d7974e5fb
commit
9ecbadcedb
@ -362,7 +362,12 @@ impl PatStack {
|
||||
cx: &MatchCheckCtx,
|
||||
constructor: &Constructor,
|
||||
) -> MatchCheckResult<Option<PatStack>> {
|
||||
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<PatIdOrWild> {
|
||||
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)]
|
||||
|
Loading…
x
Reference in New Issue
Block a user