mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 08:53:35 +00:00
Fix eval_order_dependence async false positive
This commit is contained in:
parent
2b38399920
commit
7a7b8bd3e8
@ -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 {
|
||||
|
@ -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];
|
||||
}
|
||||
|
@ -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;
|
||||
| ^^^^^^
|
||||
|
Loading…
Reference in New Issue
Block a user