Skip to content

Commit

Permalink
Fix eval_order_dependence async false positive
Browse files Browse the repository at this point in the history
  • Loading branch information
camsteffen committed May 5, 2021
1 parent 2b38399 commit 7a7b8bd
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 22 deletions.
28 changes: 14 additions & 14 deletions 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};
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
6 changes: 6 additions & 0 deletions tests/ui/eval_order_dependence.rs
@@ -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];
}
16 changes: 8 additions & 8 deletions tests/ui/eval_order_dependence.stderr
@@ -1,48 +1,48 @@
error: unsequenced read of `x`
--> $DIR/eval_order_dependence.rs:15:9
--> $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 `x`
--> $DIR/eval_order_dependence.rs:18:5
--> $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 `x`
--> $DIR/eval_order_dependence.rs:31:12
--> $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 `x`
--> $DIR/eval_order_dependence.rs:40:9
--> $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 7a7b8bd

Please sign in to comment.