give up when gurad has side effects
This commit is contained in:
parent
459821b191
commit
45084eeefb
@ -8,7 +8,7 @@
|
|||||||
};
|
};
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::LangItem::OptionNone;
|
use rustc_hir::LangItem::OptionNone;
|
||||||
use rustc_hir::{Arm, BindingAnnotation, Expr, ExprKind, FnRetTy, Node, Pat, PatKind, Path, QPath};
|
use rustc_hir::{Arm, BindingAnnotation, Expr, ExprKind, FnRetTy, Guard, Node, Pat, PatKind, Path, QPath};
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
use rustc_span::sym;
|
use rustc_span::sym;
|
||||||
use rustc_typeck::hir_ty_to_ty;
|
use rustc_typeck::hir_ty_to_ty;
|
||||||
@ -65,6 +65,22 @@ pub(crate) fn check_if_let<'tcx>(cx: &LateContext<'tcx>, ex: &Expr<'_>, if_let:
|
|||||||
fn check_all_arms(cx: &LateContext<'_>, match_expr: &Expr<'_>, arms: &[Arm<'_>]) -> bool {
|
fn check_all_arms(cx: &LateContext<'_>, match_expr: &Expr<'_>, arms: &[Arm<'_>]) -> bool {
|
||||||
for arm in arms {
|
for arm in arms {
|
||||||
let arm_expr = peel_blocks_with_stmt(arm.body);
|
let arm_expr = peel_blocks_with_stmt(arm.body);
|
||||||
|
|
||||||
|
if let Some(guard_expr) = &arm.guard {
|
||||||
|
match guard_expr {
|
||||||
|
// gives up if `pat if expr` can have side effects
|
||||||
|
Guard::If(if_cond) => {
|
||||||
|
if if_cond.can_have_side_effects() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// gives up `pat if let ...` arm
|
||||||
|
Guard::IfLet(_) => {
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
if let PatKind::Wild = arm.pat.kind {
|
if let PatKind::Wild = arm.pat.kind {
|
||||||
if !eq_expr_value(cx, match_expr, strip_return(arm_expr)) {
|
if !eq_expr_value(cx, match_expr, strip_return(arm_expr)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -209,7 +209,7 @@ impl Tr for Result<i32, i32> {
|
|||||||
|
|
||||||
mod issue9084 {
|
mod issue9084 {
|
||||||
fn wildcard_if() {
|
fn wildcard_if() {
|
||||||
let some_bool = true;
|
let mut some_bool = true;
|
||||||
let e = Some(1);
|
let e = Some(1);
|
||||||
|
|
||||||
// should lint
|
// should lint
|
||||||
@ -230,6 +230,19 @@ mod issue9084 {
|
|||||||
_ if some_bool => e,
|
_ if some_bool => e,
|
||||||
_ => e,
|
_ => e,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// should not lint (guard has side effects)
|
||||||
|
let _ = match e {
|
||||||
|
Some(i) => Some(i),
|
||||||
|
_ if {
|
||||||
|
some_bool = false;
|
||||||
|
some_bool
|
||||||
|
} =>
|
||||||
|
{
|
||||||
|
e
|
||||||
|
},
|
||||||
|
_ => e,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@ fn as_mut(&mut self) -> Result<&mut i32, &mut i32> {
|
|||||||
|
|
||||||
mod issue9084 {
|
mod issue9084 {
|
||||||
fn wildcard_if() {
|
fn wildcard_if() {
|
||||||
let some_bool = true;
|
let mut some_bool = true;
|
||||||
let e = Some(1);
|
let e = Some(1);
|
||||||
|
|
||||||
// should lint
|
// should lint
|
||||||
@ -274,6 +274,19 @@ fn wildcard_if() {
|
|||||||
_ if some_bool => e,
|
_ if some_bool => e,
|
||||||
_ => e,
|
_ => e,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// should not lint (guard has side effects)
|
||||||
|
let _ = match e {
|
||||||
|
Some(i) => Some(i),
|
||||||
|
_ if {
|
||||||
|
some_bool = false;
|
||||||
|
some_bool
|
||||||
|
} =>
|
||||||
|
{
|
||||||
|
e
|
||||||
|
},
|
||||||
|
_ => e,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user