Rollup merge of #119554 - matthewjasper:remove-guard-distinction, r=compiler-errors
Fix scoping for let chains in match guards If let guards were previously represented as a different type of guard in HIR and THIR. This meant that let chains in match guards were not handled correctly because they were treated exactly like normal guards. - Remove `hir::Guard` and `thir::Guard`. - Make the scoping different between normal guards and if let guards also check for let chains. closes #118593
This commit is contained in:
commit
958417fba1
34 changed files with 272 additions and 292 deletions
|
@ -519,20 +519,13 @@ pub struct FruInfo<'tcx> {
|
|||
#[derive(Clone, Debug, HashStable)]
|
||||
pub struct Arm<'tcx> {
|
||||
pub pattern: Box<Pat<'tcx>>,
|
||||
pub guard: Option<Guard<'tcx>>,
|
||||
pub guard: Option<ExprId>,
|
||||
pub body: ExprId,
|
||||
pub lint_level: LintLevel,
|
||||
pub scope: region::Scope,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
/// A `match` guard.
|
||||
#[derive(Clone, Debug, HashStable)]
|
||||
pub enum Guard<'tcx> {
|
||||
If(ExprId),
|
||||
IfLet(Box<Pat<'tcx>>, ExprId),
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, HashStable)]
|
||||
pub enum LogicalOp {
|
||||
/// The `&&` operator.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use super::{
|
||||
AdtExpr, Arm, Block, ClosureExpr, Expr, ExprKind, Guard, InlineAsmExpr, InlineAsmOperand, Pat,
|
||||
AdtExpr, Arm, Block, ClosureExpr, Expr, ExprKind, InlineAsmExpr, InlineAsmOperand, Pat,
|
||||
PatKind, Stmt, StmtKind, Thir,
|
||||
};
|
||||
|
||||
|
@ -213,13 +213,8 @@ pub fn walk_arm<'thir, 'tcx: 'thir, V: Visitor<'thir, 'tcx>>(
|
|||
visitor: &mut V,
|
||||
arm: &'thir Arm<'tcx>,
|
||||
) {
|
||||
match arm.guard {
|
||||
Some(Guard::If(expr)) => visitor.visit_expr(&visitor.thir()[expr]),
|
||||
Some(Guard::IfLet(ref pat, expr)) => {
|
||||
visitor.visit_pat(pat);
|
||||
visitor.visit_expr(&visitor.thir()[expr]);
|
||||
}
|
||||
None => {}
|
||||
if let Some(expr) = arm.guard {
|
||||
visitor.visit_expr(&visitor.thir()[expr])
|
||||
}
|
||||
visitor.visit_pat(&arm.pattern);
|
||||
visitor.visit_expr(&visitor.thir()[arm.body]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue