|
1 | 1 | use clippy_utils::diagnostics::{span_lint, span_lint_and_note}; |
2 | 2 | use clippy_utils::{get_parent_expr, path_to_local, path_to_local_id}; |
| 3 | +use if_chain::if_chain; |
3 | 4 | use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor}; |
4 | 5 | use rustc_hir::{BinOpKind, Block, Expr, ExprKind, Guard, HirId, Local, Node, Stmt, StmtKind}; |
5 | 6 | use rustc_lint::{LateContext, LateLintPass}; |
@@ -70,20 +71,19 @@ declare_lint_pass!(EvalOrderDependence => [EVAL_ORDER_DEPENDENCE, DIVERGING_SUB_ |
70 | 71 | impl<'tcx> LateLintPass<'tcx> for EvalOrderDependence { |
71 | 72 | fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) { |
72 | 73 | // Find a write to a local variable. |
73 | | - match expr.kind { |
74 | | - ExprKind::Assign(lhs, ..) | ExprKind::AssignOp(_, lhs, _) => { |
75 | | - if let Some(var) = path_to_local(lhs) { |
76 | | - let mut visitor = ReadVisitor { |
77 | | - cx, |
78 | | - var, |
79 | | - write_expr: expr, |
80 | | - last_expr: expr, |
81 | | - }; |
82 | | - check_for_unsequenced_reads(&mut visitor); |
83 | | - } |
84 | | - }, |
85 | | - _ => {}, |
86 | | - } |
| 74 | + let var = if_chain! { |
| 75 | + if let ExprKind::Assign(lhs, ..) | ExprKind::AssignOp(_, lhs, _) = expr.kind; |
| 76 | + if let Some(var) = path_to_local(lhs); |
| 77 | + if expr.span.desugaring_kind().is_none(); |
| 78 | + then { var } else { return; } |
| 79 | + }; |
| 80 | + let mut visitor = ReadVisitor { |
| 81 | + cx, |
| 82 | + var, |
| 83 | + write_expr: expr, |
| 84 | + last_expr: expr, |
| 85 | + }; |
| 86 | + check_for_unsequenced_reads(&mut visitor); |
87 | 87 | } |
88 | 88 | fn check_stmt(&mut self, cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) { |
89 | 89 | match stmt.kind { |
@@ -305,7 +305,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ReadVisitor<'a, 'tcx> { |
305 | 305 | self.cx, |
306 | 306 | EVAL_ORDER_DEPENDENCE, |
307 | 307 | expr.span, |
308 | | - "unsequenced read of a variable", |
| 308 | + &format!("unsequenced read of `{}`", self.cx.tcx.hir().name(self.var)), |
309 | 309 | Some(self.write_expr.span), |
310 | 310 | "whether read occurs before this write depends on evaluation order", |
311 | 311 | ); |
|
0 commit comments