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
This commit is contained in:
commit
93fe3562d0
@ -1,5 +1,6 @@
|
|||||||
use clippy_utils::diagnostics::{span_lint, span_lint_and_note};
|
use clippy_utils::diagnostics::{span_lint, span_lint_and_note};
|
||||||
use clippy_utils::{get_parent_expr, path_to_local, path_to_local_id};
|
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::intravisit::{walk_expr, NestedVisitorMap, Visitor};
|
||||||
use rustc_hir::{BinOpKind, Block, Expr, ExprKind, Guard, HirId, Local, Node, Stmt, StmtKind};
|
use rustc_hir::{BinOpKind, Block, Expr, ExprKind, Guard, HirId, Local, Node, Stmt, StmtKind};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
@ -70,9 +71,12 @@ declare_lint_pass!(EvalOrderDependence => [EVAL_ORDER_DEPENDENCE, DIVERGING_SUB_
|
|||||||
impl<'tcx> LateLintPass<'tcx> for EvalOrderDependence {
|
impl<'tcx> LateLintPass<'tcx> for EvalOrderDependence {
|
||||||
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
||||||
// Find a write to a local variable.
|
// Find a write to a local variable.
|
||||||
match expr.kind {
|
let var = if_chain! {
|
||||||
ExprKind::Assign(lhs, ..) | ExprKind::AssignOp(_, lhs, _) => {
|
if let ExprKind::Assign(lhs, ..) | ExprKind::AssignOp(_, lhs, _) = expr.kind;
|
||||||
if let Some(var) = path_to_local(lhs) {
|
if let Some(var) = path_to_local(lhs);
|
||||||
|
if expr.span.desugaring_kind().is_none();
|
||||||
|
then { var } else { return; }
|
||||||
|
};
|
||||||
let mut visitor = ReadVisitor {
|
let mut visitor = ReadVisitor {
|
||||||
cx,
|
cx,
|
||||||
var,
|
var,
|
||||||
@ -81,10 +85,6 @@ impl<'tcx> LateLintPass<'tcx> for EvalOrderDependence {
|
|||||||
};
|
};
|
||||||
check_for_unsequenced_reads(&mut visitor);
|
check_for_unsequenced_reads(&mut visitor);
|
||||||
}
|
}
|
||||||
},
|
|
||||||
_ => {},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fn check_stmt(&mut self, cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) {
|
fn check_stmt(&mut self, cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) {
|
||||||
match stmt.kind {
|
match stmt.kind {
|
||||||
StmtKind::Local(local) => {
|
StmtKind::Local(local) => {
|
||||||
@ -305,7 +305,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ReadVisitor<'a, 'tcx> {
|
|||||||
self.cx,
|
self.cx,
|
||||||
EVAL_ORDER_DEPENDENCE,
|
EVAL_ORDER_DEPENDENCE,
|
||||||
expr.span,
|
expr.span,
|
||||||
"unsequenced read of a variable",
|
&format!("unsequenced read of `{}`", self.cx.tcx.hir().name(self.var)),
|
||||||
Some(self.write_expr.span),
|
Some(self.write_expr.span),
|
||||||
"whether read occurs before this write depends on evaluation order",
|
"whether read occurs before this write depends on evaluation order",
|
||||||
);
|
);
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
// edition:2018
|
||||||
|
|
||||||
#[warn(clippy::eval_order_dependence)]
|
#[warn(clippy::eval_order_dependence)]
|
||||||
#[allow(
|
#[allow(
|
||||||
unused_assignments,
|
unused_assignments,
|
||||||
@ -107,3 +109,7 @@ fn main() {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn issue_6925() {
|
||||||
|
let _ = vec![async { true }.await, async { false }.await];
|
||||||
|
}
|
||||||
|
@ -1,48 +1,48 @@
|
|||||||
error: unsequenced read of a variable
|
error: unsequenced read of `x`
|
||||||
--> $DIR/eval_order_dependence.rs:15:9
|
--> $DIR/eval_order_dependence.rs:17:9
|
||||||
|
|
|
|
||||||
LL | } + x;
|
LL | } + x;
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
= note: `-D clippy::eval-order-dependence` implied by `-D warnings`
|
= note: `-D clippy::eval-order-dependence` implied by `-D warnings`
|
||||||
note: whether read occurs before this write depends on evaluation order
|
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;
|
LL | x = 1;
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: unsequenced read of a variable
|
error: unsequenced read of `x`
|
||||||
--> $DIR/eval_order_dependence.rs:18:5
|
--> $DIR/eval_order_dependence.rs:20:5
|
||||||
|
|
|
|
||||||
LL | x += {
|
LL | x += {
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
note: whether read occurs before this write depends on evaluation order
|
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;
|
LL | x = 20;
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error: unsequenced read of a variable
|
error: unsequenced read of `x`
|
||||||
--> $DIR/eval_order_dependence.rs:31:12
|
--> $DIR/eval_order_dependence.rs:33:12
|
||||||
|
|
|
|
||||||
LL | a: x,
|
LL | a: x,
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
note: whether read occurs before this write depends on evaluation order
|
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;
|
LL | x = 6;
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error: unsequenced read of a variable
|
error: unsequenced read of `x`
|
||||||
--> $DIR/eval_order_dependence.rs:40:9
|
--> $DIR/eval_order_dependence.rs:42:9
|
||||||
|
|
|
|
||||||
LL | x += {
|
LL | x += {
|
||||||
| ^
|
| ^
|
||||||
|
|
|
|
||||||
note: whether read occurs before this write depends on evaluation order
|
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;
|
LL | x = 20;
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
Loading…
x
Reference in New Issue
Block a user