|
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