This commit is contained in:
Raiki Tamura 2023-01-05 18:30:13 +09:00
parent 61ff54e5c2
commit 79ed23ff81
4 changed files with 95 additions and 1 deletions

View file

@ -1,6 +1,7 @@
use super::SINGLE_ELEMENT_LOOP;
use clippy_utils::diagnostics::span_lint_and_sugg;
use clippy_utils::source::{indent_of, snippet_with_applicability};
use clippy_utils::visitors::for_each_expr;
use if_chain::if_chain;
use rustc_ast::util::parser::PREC_PREFIX;
use rustc_ast::Mutability;
@ -8,6 +9,18 @@ use rustc_errors::Applicability;
use rustc_hir::{is_range_literal, BorrowKind, Expr, ExprKind, Pat};
use rustc_lint::LateContext;
use rustc_span::edition::Edition;
use std::ops::ControlFlow;
fn contains_break_or_continue(expr: &Expr<'_>) -> bool {
for_each_expr(expr, |e| {
if matches!(e.kind, ExprKind::Break(..) | ExprKind::Continue(..)) {
ControlFlow::Break(())
} else {
ControlFlow::Continue(())
}
})
.is_some()
}
pub(super) fn check<'tcx>(
cx: &LateContext<'tcx>,
@ -67,6 +80,7 @@ pub(super) fn check<'tcx>(
if_chain! {
if let ExprKind::Block(block, _) = body.kind;
if !block.stmts.is_empty();
if !contains_break_or_continue(body);
then {
let mut applicability = Applicability::MachineApplicable;
let pat_snip = snippet_with_applicability(cx, pat.span, "..", &mut applicability);

View file

@ -33,4 +33,31 @@ fn main() {
let item = 0..5;
dbg!(item);
}
// should not lint (issue #10018)
for e in [42] {
if e > 0 {
continue;
}
}
// should not lint (issue #10018)
for e in [42] {
if e > 0 {
break;
}
}
// should lint (issue #10018)
{
let _ = 42;
let _f = |n: u32| {
for i in 0..n {
if i > 10 {
dbg!(i);
break;
}
}
};
}
}

View file

@ -27,4 +27,30 @@ fn main() {
for item in [0..5].into_iter() {
dbg!(item);
}
// should not lint (issue #10018)
for e in [42] {
if e > 0 {
continue;
}
}
// should not lint (issue #10018)
for e in [42] {
if e > 0 {
break;
}
}
// should lint (issue #10018)
for _ in [42] {
let _f = |n: u32| {
for i in 0..n {
if i > 10 {
dbg!(i);
break;
}
}
};
}
}

View file

@ -95,5 +95,32 @@ LL + dbg!(item);
LL + }
|
error: aborting due to 6 previous errors
error: for loop over a single element
--> $DIR/single_element_loop.rs:46:5
|
LL | / for _ in [42] {
LL | | let _f = |n: u32| {
LL | | for i in 0..n {
LL | | if i > 10 {
... |
LL | | };
LL | | }
| |_____^
|
help: try
|
LL ~ {
LL + let _ = 42;
LL + let _f = |n: u32| {
LL + for i in 0..n {
LL + if i > 10 {
LL + dbg!(i);
LL + break;
LL + }
LL + }
LL + };
LL + }
|
error: aborting due to 7 previous errors