about summary refs log tree commit diff
diff options
context:
space:
mode:
authorxizheyin <xizheyin@smail.nju.edu.cn>2025-05-08 21:12:02 +0800
committerxizheyin <xizheyin@smail.nju.edu.cn>2025-05-08 21:17:33 +0800
commit88c1796384cca81ca80e728d45f6673f601493ff (patch)
tree4877b38874fa9a0bf39b428dbda05c726a7362cf
parentc0f0b5157f89dad5169a75d2475be408d800aafa (diff)
downloadrust-88c1796384cca81ca80e728d45f6673f601493ff.tar.gz
rust-88c1796384cca81ca80e728d45f6673f601493ff.zip
Use span before macro expansion in lint for-loops-over-falibles
Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
-rw-r--r--compiler/rustc_lint/src/for_loops_over_fallibles.rs12
-rw-r--r--tests/ui/lint/for-loops-over-falibles/macro-issue-140747.rs4
-rw-r--r--tests/ui/lint/for-loops-over-falibles/macro-issue-140747.stderr20
3 files changed, 15 insertions, 21 deletions
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::<i32> //~ ERROR for loop over an `Option`. This is more readably written as an `if let` statement [for_loops_over_fallibles]
+            None::<i32>
         };
     }
-    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::<i32>
-   |             ^^^^^^^^^^^
-...
 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