give up when gurad has side effects

This commit is contained in:
tamaron 2022-08-11 12:00:46 +09:00
parent 459821b191
commit 45084eeefb
3 changed files with 45 additions and 3 deletions

View File

@ -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;

View File

@ -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,
};
} }
} }

View File

@ -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,
};
} }
} }