about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-05-05 21:18:05 +0000
committerbors <bors@rust-lang.org>2021-05-05 21:18:05 +0000
commit93fe3562d0ce22f489e577ea9f6a56f2dab97770 (patch)
tree8cdb7700c8cdd685d3fd92efb94a0d48a714bba9
parent182a1853c3adfed34b084614c333d4945d5a24f2 (diff)
parent7a7b8bd3e885ec97725579d89ba3ac12a1e6f93f (diff)
downloadrust-93fe3562d0ce22f489e577ea9f6a56f2dab97770.tar.gz
rust-93fe3562d0ce22f489e577ea9f6a56f2dab97770.zip
Auto merge of #7174 - camsteffen:eval-order-async, r=flip1995
Fix eval_order_dependence async false positive

changelog: Fix [`eval_order_dependence`] false positive in async code

Fixes #6925
-rw-r--r--clippy_lints/src/eval_order_dependence.rs30
-rw-r--r--tests/ui/eval_order_dependence.rs6
-rw-r--r--tests/ui/eval_order_dependence.stderr24
3 files changed, 33 insertions, 27 deletions
diff --git a/clippy_lints/src/eval_order_dependence.rs b/clippy_lints/src/eval_order_dependence.rs
index 762f64fe37a..41acf55dd7d 100644
--- a/clippy_lints/src/eval_order_dependence.rs
+++ b/clippy_lints/src/eval_order_dependence.rs
@@ -1,5 +1,6 @@
 use clippy_utils::diagnostics::{span_lint, span_lint_and_note};
 use clippy_utils::{get_parent_expr, path_to_local, path_to_local_id};
+use if_chain::if_chain;
 use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor};
 use rustc_hir::{BinOpKind, Block, Expr, ExprKind, Guard, HirId, Local, Node, Stmt, StmtKind};
 use rustc_lint::{LateContext, LateLintPass};
@@ -70,20 +71,19 @@ declare_lint_pass!(EvalOrderDependence => [EVAL_ORDER_DEPENDENCE, DIVERGING_SUB_
 impl<'tcx> LateLintPass<'tcx> for EvalOrderDependence {
     fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
         // Find a write to a local variable.
-        match expr.kind {
-            ExprKind::Assign(lhs, ..) | ExprKind::AssignOp(_, lhs, _) => {
-                if let Some(var) = path_to_local(lhs) {
-                    let mut visitor = ReadVisitor {
-                        cx,
-                        var,
-                        write_expr: expr,
-                        last_expr: expr,
-                    };
-                    check_for_unsequenced_reads(&mut visitor);
-                }
-            },
-            _ => {},
-        }
+        let var = if_chain! {
+            if let ExprKind::Assign(lhs, ..) | ExprKind::AssignOp(_, lhs, _) = expr.kind;
+            if let Some(var) = path_to_local(lhs);
+            if expr.span.desugaring_kind().is_none();
+            then { var } else { return; }
+        };
+        let mut visitor = ReadVisitor {
+            cx,
+            var,
+            write_expr: expr,
+            last_expr: expr,
+        };
+        check_for_unsequenced_reads(&mut visitor);
     }
     fn check_stmt(&mut self, cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) {
         match stmt.kind {
@@ -305,7 +305,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ReadVisitor<'a, 'tcx> {
                     self.cx,
                     EVAL_ORDER_DEPENDENCE,
                     expr.span,
-                    "unsequenced read of a variable",
+                    &format!("unsequenced read of `{}`", self.cx.tcx.hir().name(self.var)),
                     Some(self.write_expr.span),
                     "whether read occurs before this write depends on evaluation order",
                 );
diff --git a/tests/ui/eval_order_dependence.rs b/tests/ui/eval_order_dependence.rs
index d806bc6d401..d742856bc41 100644
--- a/tests/ui/eval_order_dependence.rs
+++ b/tests/ui/eval_order_dependence.rs
@@ -1,3 +1,5 @@
+// edition:2018
+
 #[warn(clippy::eval_order_dependence)]
 #[allow(
     unused_assignments,
@@ -107,3 +109,7 @@ fn main() {
         },
     );
 }
+
+async fn issue_6925() {
+    let _ = vec![async { true }.await, async { false }.await];
+}
diff --git a/tests/ui/eval_order_dependence.stderr b/tests/ui/eval_order_dependence.stderr
index 8f4fa2228f7..35eb85e95a3 100644
--- a/tests/ui/eval_order_dependence.stderr
+++ b/tests/ui/eval_order_dependence.stderr
@@ -1,48 +1,48 @@
-error: unsequenced read of a variable
-  --> $DIR/eval_order_dependence.rs:15:9
+error: unsequenced read of `x`
+  --> $DIR/eval_order_dependence.rs:17:9
    |
 LL |     } + x;
    |         ^
    |
    = note: `-D clippy::eval-order-dependence` implied by `-D warnings`
 note: whether read occurs before this write depends on evaluation order
-  --> $DIR/eval_order_dependence.rs:13:9
+  --> $DIR/eval_order_dependence.rs:15:9
    |
 LL |         x = 1;
    |         ^^^^^
 
-error: unsequenced read of a variable
-  --> $DIR/eval_order_dependence.rs:18:5
+error: unsequenced read of `x`
+  --> $DIR/eval_order_dependence.rs:20:5
    |
 LL |     x += {
    |     ^
    |
 note: whether read occurs before this write depends on evaluation order
-  --> $DIR/eval_order_dependence.rs:19:9
+  --> $DIR/eval_order_dependence.rs:21:9
    |
 LL |         x = 20;
    |         ^^^^^^
 
-error: unsequenced read of a variable
-  --> $DIR/eval_order_dependence.rs:31:12
+error: unsequenced read of `x`
+  --> $DIR/eval_order_dependence.rs:33:12
    |
 LL |         a: x,
    |            ^
    |
 note: whether read occurs before this write depends on evaluation order
-  --> $DIR/eval_order_dependence.rs:33:13
+  --> $DIR/eval_order_dependence.rs:35:13
    |
 LL |             x = 6;
    |             ^^^^^
 
-error: unsequenced read of a variable
-  --> $DIR/eval_order_dependence.rs:40:9
+error: unsequenced read of `x`
+  --> $DIR/eval_order_dependence.rs:42:9
    |
 LL |         x += {
    |         ^
    |
 note: whether read occurs before this write depends on evaluation order
-  --> $DIR/eval_order_dependence.rs:41:13
+  --> $DIR/eval_order_dependence.rs:43:13
    |
 LL |             x = 20;
    |             ^^^^^^