Skip to content

Commit

Permalink
Auto merge of #7174 - camsteffen:eval-order-async, r=flip1995
Browse files Browse the repository at this point in the history
Fix eval_order_dependence async false positive

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

Fixes #6925
  • Loading branch information
bors committed May 5, 2021
2 parents 182a185 + 7a7b8bd commit 93fe356
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 27 deletions.
30 changes: 15 additions & 15 deletions clippy_lints/src/eval_order_dependence.rs
Original file line number Diff line number Diff line change
@@ -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};
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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",
);
Expand Down
6 changes: 6 additions & 0 deletions tests/ui/eval_order_dependence.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// edition:2018

#[warn(clippy::eval_order_dependence)]
#[allow(
unused_assignments,
Expand Down Expand Up @@ -107,3 +109,7 @@ fn main() {
},
);
}

async fn issue_6925() {
let _ = vec![async { true }.await, async { false }.await];
}
24 changes: 12 additions & 12 deletions tests/ui/eval_order_dependence.stderr
Original file line number Diff line number Diff line change
@@ -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;
| ^^^^^^
Expand Down

0 comments on commit 93fe356

Please sign in to comment.