@@ -150,8 +150,8 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for MatchVisitor<'a, '_, 'tcx> {
150
150
ExprKind :: Let { box ref pat, expr } => {
151
151
self . check_let ( pat, expr, self . let_source , ex. span ) ;
152
152
}
153
- ExprKind :: LogicalOp { op : LogicalOp :: And , lhs , rhs } => {
154
- self . check_let_chain ( self . let_source , ex. span , lhs , rhs ) ;
153
+ ExprKind :: LogicalOp { op : LogicalOp :: And , .. } => {
154
+ self . check_let_chain ( self . let_source , ex) ;
155
155
}
156
156
_ => { }
157
157
} ;
@@ -326,71 +326,61 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> {
326
326
}
327
327
328
328
#[ instrument( level = "trace" , skip( self ) ) ]
329
- fn check_let_chain (
330
- & mut self ,
331
- let_source : LetSource ,
332
- top_expr_span : Span ,
333
- mut lhs : ExprId ,
334
- rhs : ExprId ,
335
- ) {
329
+ fn check_let_chain ( & mut self , let_source : LetSource , expr : & Expr < ' tcx > ) {
336
330
if let LetSource :: None = let_source {
337
331
return ;
338
332
}
339
333
340
- // Lint level enclosing the next `lhs`.
341
- let mut cur_lint_level = self . lint_level ;
334
+ let top_expr_span = expr. span ;
335
+
336
+ // Lint level enclosing `next_expr`.
337
+ let mut next_expr_lint_level = self . lint_level ;
342
338
343
339
// Obtain the refutabilities of all exprs in the chain,
344
340
// and record chain members that aren't let exprs.
345
341
let mut chain_refutabilities = Vec :: new ( ) ;
346
342
347
343
let mut error = Ok ( ( ) ) ;
348
- let mut add = |expr : ExprId , mut local_lint_level| {
349
- // `local_lint_level` is the lint level enclosing the pattern inside `expr`.
350
- let mut expr = & self . thir [ expr] ;
351
- debug ! ( ?expr, ?local_lint_level, "add" ) ;
344
+ let mut next_expr = Some ( expr) ;
345
+ while let Some ( mut expr) = next_expr {
346
+ while let ExprKind :: Scope { value, lint_level, .. } = expr. kind {
347
+ if let LintLevel :: Explicit ( hir_id) = lint_level {
348
+ next_expr_lint_level = hir_id
349
+ }
350
+ expr = & self . thir [ value] ;
351
+ }
352
+ if let ExprKind :: LogicalOp { op : LogicalOp :: And , lhs, rhs } = expr. kind {
353
+ expr = & self . thir [ rhs] ;
354
+ // Let chains recurse on the left, so we recurse into the lhs.
355
+ next_expr = Some ( & self . thir [ lhs] ) ;
356
+ } else {
357
+ next_expr = None ;
358
+ }
359
+
360
+ // Lint level enclosing `expr`.
361
+ let mut expr_lint_level = next_expr_lint_level;
352
362
// Fast-forward through scopes.
353
363
while let ExprKind :: Scope { value, lint_level, .. } = expr. kind {
354
364
if let LintLevel :: Explicit ( hir_id) = lint_level {
355
- local_lint_level = hir_id
365
+ expr_lint_level = hir_id
356
366
}
357
367
expr = & self . thir [ value] ;
358
368
}
359
- debug ! ( ?expr, ?local_lint_level, "after scopes" ) ;
360
- match expr. kind {
369
+ let value = match expr. kind {
361
370
ExprKind :: Let { box ref pat, expr : _ } => {
362
371
if let Err ( err) = pat. pat_error_reported ( ) {
363
372
error = Err ( err) ;
364
- return None ;
373
+ None
374
+ } else {
375
+ let mut ncx = self . new_cx ( expr_lint_level, true ) ;
376
+ let tpat = self . lower_pattern ( & mut ncx, pat) ;
377
+ let refutable = !is_let_irrefutable ( & mut ncx, expr_lint_level, tpat) ;
378
+ Some ( ( expr. span , refutable) )
365
379
}
366
- let mut ncx = self . new_cx ( local_lint_level, true ) ;
367
- let tpat = self . lower_pattern ( & mut ncx, pat) ;
368
- let refutable = !is_let_irrefutable ( & mut ncx, local_lint_level, tpat) ;
369
- Some ( ( expr. span , refutable) )
370
380
}
371
381
_ => None ,
372
- }
373
- } ;
374
-
375
- // Let chains recurse on the left, so we start by adding the rightmost.
376
- chain_refutabilities. push ( add ( rhs, cur_lint_level) ) ;
377
-
378
- loop {
379
- while let ExprKind :: Scope { value, lint_level, .. } = self . thir [ lhs] . kind {
380
- if let LintLevel :: Explicit ( hir_id) = lint_level {
381
- cur_lint_level = hir_id
382
- }
383
- lhs = value;
384
- }
385
- if let ExprKind :: LogicalOp { op : LogicalOp :: And , lhs : new_lhs, rhs : expr } =
386
- self . thir [ lhs] . kind
387
- {
388
- chain_refutabilities. push ( add ( expr, cur_lint_level) ) ;
389
- lhs = new_lhs;
390
- } else {
391
- chain_refutabilities. push ( add ( lhs, cur_lint_level) ) ;
392
- break ;
393
- }
382
+ } ;
383
+ chain_refutabilities. push ( value) ;
394
384
}
395
385
debug ! ( ?chain_refutabilities) ;
396
386
chain_refutabilities. reverse ( ) ;
0 commit comments