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_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_span::sym;
|
||||
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 {
|
||||
for arm in arms {
|
||||
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 !eq_expr_value(cx, match_expr, strip_return(arm_expr)) {
|
||||
return false;
|
||||
|
@ -209,7 +209,7 @@ impl Tr for Result<i32, i32> {
|
||||
|
||||
mod issue9084 {
|
||||
fn wildcard_if() {
|
||||
let some_bool = true;
|
||||
let mut some_bool = true;
|
||||
let e = Some(1);
|
||||
|
||||
// should lint
|
||||
@ -230,6 +230,19 @@ mod issue9084 {
|
||||
_ if some_bool => 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 {
|
||||
fn wildcard_if() {
|
||||
let some_bool = true;
|
||||
let mut some_bool = true;
|
||||
let e = Some(1);
|
||||
|
||||
// should lint
|
||||
@ -274,6 +274,19 @@ fn wildcard_if() {
|
||||
_ if some_bool => 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