about summary refs log tree commit diff
path: root/compiler/rustc_pattern_analysis/src/lints.rs
diff options
context:
space:
mode:
authorNadrieril <nadrieril+git@gmail.com>2024-01-07 11:03:40 +0100
committerNadrieril <nadrieril+git@gmail.com>2024-01-07 19:20:19 +0100
commit4ae2840e84515edacee07ee7512ee50e51746c9d (patch)
treec7b545571e8eedb26cd48a2753c462aedf8352b1 /compiler/rustc_pattern_analysis/src/lints.rs
parent30ca1c0a5db532d75f7785e9fb530e0b4388bbd5 (diff)
downloadrust-4ae2840e84515edacee07ee7512ee50e51746c9d.tar.gz
rust-4ae2840e84515edacee07ee7512ee50e51746c9d.zip
Use special enum to represent algorithm-generated wildcards in the matrix
Diffstat (limited to 'compiler/rustc_pattern_analysis/src/lints.rs')
-rw-r--r--compiler/rustc_pattern_analysis/src/lints.rs17
1 files changed, 9 insertions, 8 deletions
diff --git a/compiler/rustc_pattern_analysis/src/lints.rs b/compiler/rustc_pattern_analysis/src/lints.rs
index de87875fd0e..4fdbbfa8578 100644
--- a/compiler/rustc_pattern_analysis/src/lints.rs
+++ b/compiler/rustc_pattern_analysis/src/lints.rs
@@ -11,6 +11,7 @@ use crate::errors::{
     NonExhaustiveOmittedPattern, NonExhaustiveOmittedPatternLintOnArm, Overlap,
     OverlappingRangeEndpoints, Uncovered,
 };
+use crate::pat::PatOrWild;
 use crate::rustc::{
     Constructor, DeconstructedPat, MatchArm, MatchCtxt, PlaceCtxt, RevealedTy, RustcMatchCheckCtxt,
     SplitConstructorSet, WitnessPat,
@@ -36,21 +37,21 @@ impl<'p, 'tcx> PatternColumn<'p, 'tcx> {
         let patterns = Vec::with_capacity(arms.len());
         let mut column = PatternColumn { patterns };
         for arm in arms {
-            column.expand_and_push(arm.pat);
+            column.expand_and_push(PatOrWild::Pat(arm.pat));
         }
         column
     }
-    fn expand_and_push(&mut self, pat: &'p DeconstructedPat<'p, 'tcx>) {
+    fn expand_and_push(&mut self, pat: PatOrWild<'p, RustcMatchCheckCtxt<'p, 'tcx>>) {
+        // We flatten or-patterns and skip wildcards
         if pat.is_or_pat() {
-            self.patterns.extend(pat.flatten_or_pat())
-        } else {
+            self.patterns.extend(
+                pat.flatten_or_pat().into_iter().filter_map(|pat_or_wild| pat_or_wild.as_pat()),
+            )
+        } else if let Some(pat) = pat.as_pat() {
             self.patterns.push(pat)
         }
     }
 
-    fn is_empty(&self) -> bool {
-        self.patterns.is_empty()
-    }
     fn head_ty(&self) -> Option<RevealedTy<'tcx>> {
         self.patterns.first().map(|pat| pat.ty())
     }
@@ -90,7 +91,7 @@ impl<'p, 'tcx> PatternColumn<'p, 'tcx> {
         let ctor_sub_tys = pcx.ctor_sub_tys(ctor);
         for pat in relevant_patterns {
             let specialized = pat.specialize(pcx, ctor, ctor_sub_tys);
-            for (subpat, column) in specialized.iter().zip(&mut specialized_columns) {
+            for (subpat, column) in specialized.into_iter().zip(&mut specialized_columns) {
                 column.expand_and_push(subpat);
             }
         }