Simplify hoisting of ref patterns (& and &mut)

This commit is contained in:
Zalathar 2024-08-02 20:59:25 +10:00
parent a245bfa617
commit 582208b0f2

View File

@ -828,7 +828,6 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
use print::{FieldPat, Pat, PatKind}; use print::{FieldPat, Pat, PatKind};
let cx = self; let cx = self;
let hoist = |p| Box::new(cx.hoist_witness_pat(p)); let hoist = |p| Box::new(cx.hoist_witness_pat(p));
let mut subpatterns = pat.iter_fields().map(hoist);
let kind = match pat.ctor() { let kind = match pat.ctor() {
Bool(b) => PatKind::Constant { value: mir::Const::from_bool(cx.tcx, *b) }, Bool(b) => PatKind::Constant { value: mir::Const::from_bool(cx.tcx, *b) },
IntRange(range) => return self.hoist_pat_range(range, *pat.ty()), IntRange(range) => return self.hoist_pat_range(range, *pat.ty()),
@ -855,11 +854,7 @@ impl<'p, 'tcx: 'p> RustcPatCtxt<'p, 'tcx> {
PatKind::StructLike { enum_info, subpatterns } PatKind::StructLike { enum_info, subpatterns }
} }
// Note: given the expansion of `&str` patterns done in `expand_pattern`, we should Ref => PatKind::Deref { subpattern: hoist(&pat.fields[0]) },
// 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
// ignore this issue.
Ref => PatKind::Deref { subpattern: subpatterns.next().unwrap() },
Slice(slice) => { Slice(slice) => {
let (prefix_len, has_dot_dot) = match slice.kind { let (prefix_len, has_dot_dot) = match slice.kind {
SliceKind::FixedLen(len) => (len, false), SliceKind::FixedLen(len) => (len, false),