diff --git a/compiler/rustc_lint/src/for_loops_over_fallibles.rs b/compiler/rustc_lint/src/for_loops_over_fallibles.rs index 757fc1f58bd..a56b753bda7 100644 --- a/compiler/rustc_lint/src/for_loops_over_fallibles.rs +++ b/compiler/rustc_lint/src/for_loops_over_fallibles.rs @@ -49,6 +49,8 @@ impl<'tcx> LateLintPass<'tcx> for ForLoopsOverFallibles { fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) { let Some((pat, arg)) = extract_for_loop(expr) else { return }; + let arg_span = arg.span.source_callsite(); + let ty = cx.typeck_results().expr_ty(arg); let (adt, args, ref_mutability) = match ty.kind() { @@ -78,27 +80,27 @@ impl<'tcx> LateLintPass<'tcx> for ForLoopsOverFallibles { && let Ok(recv_snip) = cx.sess().source_map().span_to_snippet(recv.span) { ForLoopsOverFalliblesLoopSub::RemoveNext { - suggestion: recv.span.between(arg.span.shrink_to_hi()), + suggestion: recv.span.between(arg_span.shrink_to_hi()), recv_snip, } } else { ForLoopsOverFalliblesLoopSub::UseWhileLet { start_span: expr.span.with_hi(pat.span.lo()), - end_span: pat.span.between(arg.span), + end_span: pat.span.between(arg_span), var, } }; let question_mark = suggest_question_mark(cx, adt, args, expr.span) - .then(|| ForLoopsOverFalliblesQuestionMark { suggestion: arg.span.shrink_to_hi() }); + .then(|| ForLoopsOverFalliblesQuestionMark { suggestion: arg_span.shrink_to_hi() }); let suggestion = ForLoopsOverFalliblesSuggestion { var, start_span: expr.span.with_hi(pat.span.lo()), - end_span: pat.span.between(arg.span), + end_span: pat.span.between(arg_span), }; cx.emit_span_lint( FOR_LOOPS_OVER_FALLIBLES, - arg.span, + arg_span, ForLoopsOverFalliblesDiag { article, ref_prefix, ty, sub, question_mark, suggestion }, ); } diff --git a/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.rs b/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.rs index 0e6b88cbdc0..33a89ced963 100644 --- a/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.rs +++ b/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.rs @@ -3,8 +3,8 @@ fn main() { macro_rules! x { () => { - None:: //~ ERROR for loop over an `Option`. This is more readably written as an `if let` statement [for_loops_over_fallibles] + None:: }; } - for _ in x! {} {} + for _ in x! {} {} //~ ERROR for loop over an `Option`. This is more readably written as an `if let` statement [for_loops_over_fallibles] } diff --git a/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.stderr b/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.stderr index 1dc5f320773..550d26045fb 100644 --- a/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.stderr +++ b/tests/ui/lint/for-loops-over-falibles/macro-issue-140747.stderr @@ -1,31 +1,23 @@ error: for loop over an `Option`. This is more readably written as an `if let` statement - --> $DIR/macro-issue-140747.rs:6:13 + --> $DIR/macro-issue-140747.rs:9:14 | -LL | None:: - | ^^^^^^^^^^^ -... LL | for _ in x! {} {} - | ----- in this macro invocation + | ^^^^^ | note: the lint level is defined here --> $DIR/macro-issue-140747.rs:1:11 | LL | #![forbid(for_loops_over_fallibles)] | ^^^^^^^^^^^^^^^^^^^^^^^^ - = note: this error originates in the macro `x` (in Nightly builds, run with -Z macro-backtrace for more info) help: to check pattern in a loop use `while let` | -LL ~ ) = -LL | }; -LL | } -LL ~ while let Some(_ in x! {} {} +LL - for _ in x! {} {} +LL + while let Some(_) = x! {} {} | help: consider using `if let` to clear intent | -LL ~ ) = -LL | }; -LL | } -LL ~ if let Some(_ in x! {} {} +LL - for _ in x! {} {} +LL + if let Some(_) = x! {} {} | error: aborting due to 1 previous error