diff options
| author | bendn <bend.n@outlook.com> | 2024-03-20 23:33:16 +0700 |
|---|---|---|
| committer | bendn <bend.n@outlook.com> | 2024-03-20 23:33:16 +0700 |
| commit | 22f57ff5842fde8acf78ea59528c149b0046b5fb (patch) | |
| tree | 4e6b81a0d824c8f06e8ed78404a24e9084b3e456 | |
| parent | 89aba8d45d116844b7d606b844a9388a4e099081 (diff) | |
| download | rust-22f57ff5842fde8acf78ea59528c149b0046b5fb.tar.gz rust-22f57ff5842fde8acf78ea59528c149b0046b5fb.zip | |
fix `for x in y unsafe { }`
| -rw-r--r-- | clippy_lints/src/needless_for_each.rs | 5 | ||||
| -rw-r--r-- | tests/ui/needless_for_each_fixable.fixed | 4 | ||||
| -rw-r--r-- | tests/ui/needless_for_each_fixable.rs | 4 |
3 files changed, 11 insertions, 2 deletions
diff --git a/clippy_lints/src/needless_for_each.rs b/clippy_lints/src/needless_for_each.rs index 84a07df1bb0..fda15f469f4 100644 --- a/clippy_lints/src/needless_for_each.rs +++ b/clippy_lints/src/needless_for_each.rs @@ -1,6 +1,6 @@ use rustc_errors::Applicability; use rustc_hir::intravisit::{walk_expr, Visitor}; -use rustc_hir::{Closure, Expr, ExprKind, Stmt, StmtKind}; +use rustc_hir::{Block, BlockCheckMode, Closure, Expr, ExprKind, Stmt, StmtKind}; use rustc_lint::{LateContext, LateLintPass}; use rustc_session::declare_lint_pass; use rustc_span::{sym, Span, Symbol}; @@ -68,7 +68,8 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessForEach { // e.g. `v.iter().for_each(f)` is simpler and clearer than using `for` loop. && let ExprKind::Closure(&Closure { body, .. }) = for_each_arg.kind && let body = cx.tcx.hir().body(body) - && let ExprKind::Block(..) = body.value.kind + // Skip the lint if the body is not safe. + && let ExprKind::Block(Block { rules: BlockCheckMode::DefaultBlock, .. }, ..) = body.value.kind { let mut ret_collector = RetCollector::default(); ret_collector.visit_expr(body.value); diff --git a/tests/ui/needless_for_each_fixable.fixed b/tests/ui/needless_for_each_fixable.fixed index 8c0e7ba7627..2362314290e 100644 --- a/tests/ui/needless_for_each_fixable.fixed +++ b/tests/ui/needless_for_each_fixable.fixed @@ -113,6 +113,10 @@ fn should_not_lint() { let _ = v.iter().for_each(|elem| { acc += elem; }); + // `for_each` has a closure with an unsafe block. + v.iter().for_each(|elem| unsafe { + acc += elem; + }); } fn main() {} diff --git a/tests/ui/needless_for_each_fixable.rs b/tests/ui/needless_for_each_fixable.rs index cdc903a636c..5b1186daa22 100644 --- a/tests/ui/needless_for_each_fixable.rs +++ b/tests/ui/needless_for_each_fixable.rs @@ -113,6 +113,10 @@ fn should_not_lint() { let _ = v.iter().for_each(|elem| { acc += elem; }); + // `for_each` has a closure with an unsafe block. + v.iter().for_each(|elem| unsafe { + acc += elem; + }); } fn main() {} |
