Skip to content

Commit 50e10b3

Browse files
committed
Tweak lower_pat_expr
1 parent 090d764 commit 50e10b3

File tree

1 file changed

+33
-35
lines changed
  • compiler/rustc_mir_build/src/thir/pattern

1 file changed

+33
-35
lines changed

compiler/rustc_mir_build/src/thir/pattern/mod.rs

+33-35
Original file line numberDiff line numberDiff line change
@@ -617,43 +617,41 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
617617
expr: &'tcx hir::PatExpr<'tcx>,
618618
pat_ty: Option<Ty<'tcx>>,
619619
) -> PatKind<'tcx> {
620-
let (lit, neg) = match &expr.kind {
621-
hir::PatExprKind::Path(qpath) => {
622-
return self.lower_path(qpath, expr.hir_id, expr.span).kind;
623-
}
620+
match &expr.kind {
621+
hir::PatExprKind::Path(qpath) => self.lower_path(qpath, expr.hir_id, expr.span).kind,
624622
hir::PatExprKind::ConstBlock(anon_const) => {
625-
return self.lower_inline_const(anon_const, expr.hir_id, expr.span);
623+
self.lower_inline_const(anon_const, expr.hir_id, expr.span)
626624
}
627-
hir::PatExprKind::Lit { lit, negated } => (lit, *negated),
628-
};
629-
630-
// We handle byte string literal patterns by using the pattern's type instead of the
631-
// literal's type in `const_to_pat`: if the literal `b"..."` matches on a slice reference,
632-
// the pattern's type will be `&[u8]` whereas the literal's type is `&[u8; 3]`; using the
633-
// pattern's type means we'll properly translate it to a slice reference pattern. This works
634-
// because slices and arrays have the same valtree representation.
635-
// HACK: As an exception, use the literal's type if `pat_ty` is `String`; this can happen if
636-
// `string_deref_patterns` is enabled. There's a special case for that when lowering to MIR.
637-
// FIXME(deref_patterns): This hack won't be necessary once `string_deref_patterns` is
638-
// superseded by a more general implementation of deref patterns.
639-
let ct_ty = match pat_ty {
640-
Some(pat_ty)
641-
if let ty::Adt(def, _) = *pat_ty.kind()
642-
&& self.tcx.is_lang_item(def.did(), LangItem::String) =>
643-
{
644-
if !self.tcx.features().string_deref_patterns() {
645-
span_bug!(
646-
expr.span,
647-
"matching on `String` went through without enabling string_deref_patterns"
648-
);
649-
}
650-
self.typeck_results.node_type(expr.hir_id)
625+
hir::PatExprKind::Lit { lit, negated } => {
626+
// We handle byte string literal patterns by using the pattern's type instead of the
627+
// literal's type in `const_to_pat`: if the literal `b"..."` matches on a slice reference,
628+
// the pattern's type will be `&[u8]` whereas the literal's type is `&[u8; 3]`; using the
629+
// pattern's type means we'll properly translate it to a slice reference pattern. This works
630+
// because slices and arrays have the same valtree representation.
631+
// HACK: As an exception, use the literal's type if `pat_ty` is `String`; this can happen if
632+
// `string_deref_patterns` is enabled. There's a special case for that when lowering to MIR.
633+
// FIXME(deref_patterns): This hack won't be necessary once `string_deref_patterns` is
634+
// superseded by a more general implementation of deref patterns.
635+
let ct_ty = match pat_ty {
636+
Some(pat_ty)
637+
if let ty::Adt(def, _) = *pat_ty.kind()
638+
&& self.tcx.is_lang_item(def.did(), LangItem::String) =>
639+
{
640+
if !self.tcx.features().string_deref_patterns() {
641+
span_bug!(
642+
expr.span,
643+
"matching on `String` went through without enabling string_deref_patterns"
644+
);
645+
}
646+
self.typeck_results.node_type(expr.hir_id)
647+
}
648+
Some(pat_ty) => pat_ty,
649+
None => self.typeck_results.node_type(expr.hir_id),
650+
};
651+
let lit_input = LitToConstInput { lit: &lit.node, ty: ct_ty, neg: *negated };
652+
let constant = self.tcx.at(expr.span).lit_to_const(lit_input);
653+
self.const_to_pat(constant, ct_ty, expr.hir_id, lit.span).kind
651654
}
652-
Some(pat_ty) => pat_ty,
653-
None => self.typeck_results.node_type(expr.hir_id),
654-
};
655-
let lit_input = LitToConstInput { lit: &lit.node, ty: ct_ty, neg };
656-
let constant = self.tcx.at(expr.span).lit_to_const(lit_input);
657-
self.const_to_pat(constant, ct_ty, expr.hir_id, lit.span).kind
655+
}
658656
}
659657
}

0 commit comments

Comments
 (0)