]> git.lizzy.rs Git - rust.git/commitdiff
Fix index-out-of-bounds panic in match checking
authorJonas Schievink <jonasschievink@gmail.com>
Tue, 16 Jun 2020 20:45:34 +0000 (22:45 +0200)
committerJonas Schievink <jonasschievink@gmail.com>
Tue, 16 Jun 2020 20:45:34 +0000 (22:45 +0200)
crates/ra_hir_ty/src/_match.rs

index fff25719325eccf5679cac94f692c8a1f5498ec5..42004282c736f1806f1a30d019bdaf01cdc732f2 100644 (file)
@@ -362,7 +362,12 @@ fn specialize_constructor(
         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 @@ fn is_empty(&self) -> bool {
     }
 
     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 @@ fn test_fn() {
 
         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)]