summary refs log tree commit diff
path: root/compiler/rustc_pattern_analysis
diff options
context:
space:
mode:
authorZalathar <Zalathar@users.noreply.github.com>2024-08-02 20:28:56 +1000
committerZalathar <Zalathar@users.noreply.github.com>2024-08-07 20:52:47 +1000
commitc764bea0c3d8ca9b9fc40b032376d5a1ea1e9096 (patch)
tree94c2ce279aa5a481e9e94883537bfcef5f13a7a2 /compiler/rustc_pattern_analysis
parenta5ed6fb646f554a3e2071dfdd3a3de2f83b759ec (diff)
downloadrust-c764bea0c3d8ca9b9fc40b032376d5a1ea1e9096.tar.gz
rust-c764bea0c3d8ca9b9fc40b032376d5a1ea1e9096.zip
Simplify hoisting of struct-like patterns
Diffstat (limited to 'compiler/rustc_pattern_analysis')
-rw-r--r--compiler/rustc_pattern_analysis/src/rustc.rs39
1 files changed, 16 insertions, 23 deletions
diff --git a/compiler/rustc_pattern_analysis/src/rustc.rs b/compiler/rustc_pattern_analysis/src/rustc.rs
index 7eee5220ce4..78355d6c762 100644
--- a/compiler/rustc_pattern_analysis/src/rustc.rs
+++ b/compiler/rustc_pattern_analysis/src/rustc.rs
@@ -838,31 +838,24 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
                 // of type `Box` is to use a `box` pattern via #[feature(box_patterns)].
                 PatKind::Box { subpattern: hoist(&pat.fields[0]) }
             }
-            Struct | Variant(_) | UnionField => match pat.ty().kind() {
-                ty::Tuple(..) => PatKind::StructLike {
-                    enum_info: EnumInfo::NotEnum,
-                    subpatterns: subpatterns
-                        .enumerate()
-                        .map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
-                        .collect(),
-                },
-                &ty::Adt(adt_def, _) => {
-                    let variant_index = RustcPatCtxt::variant_index_for_adt(&pat.ctor(), adt_def);
-                    let subpatterns = subpatterns
-                        .enumerate()
-                        .map(|(i, pattern)| FieldPat { field: FieldIdx::new(i), pattern })
-                        .collect();
+            Struct | Variant(_) | UnionField => {
+                let enum_info = match *pat.ty().kind() {
+                    ty::Adt(adt_def, _) if adt_def.is_enum() => EnumInfo::Enum {
+                        adt_def,
+                        variant_index: RustcPatCtxt::variant_index_for_adt(pat.ctor(), adt_def),
+                    },
+                    ty::Adt(..) | ty::Tuple(..) => EnumInfo::NotEnum,
+                    _ => bug!("unexpected ctor for type {:?} {:?}", pat.ctor(), *pat.ty()),
+                };
 
-                    let enum_info = if adt_def.is_enum() {
-                        EnumInfo::Enum { adt_def, variant_index }
-                    } else {
-                        EnumInfo::NotEnum
-                    };
+                let subpatterns = pat
+                    .iter_fields()
+                    .enumerate()
+                    .map(|(i, pat)| FieldPat { field: FieldIdx::new(i), pattern: hoist(pat) })
+                    .collect::<Vec<_>>();
 
-                    PatKind::StructLike { enum_info, subpatterns }
-                }
-                _ => bug!("unexpected ctor for type {:?} {:?}", pat.ctor(), *pat.ty()),
-            },
+                PatKind::StructLike { enum_info, subpatterns }
+            }
             // Note: given the expansion of `&str` patterns done in `expand_pattern`, we should
             // be careful to reconstruct the correct constant pattern here. However a string
             // literal pattern will never be reported as a non-exhaustiveness witness, so we