From f1243a0ceb1c596f808c8df8d1240ed301135a1b Mon Sep 17 00:00:00 2001
From: David Tolnay <dtolnay@gmail.com>
Date: Tue, 17 Dec 2024 18:49:14 -0800
Subject: [PATCH] Fix spans on macro-generated bindings and format variables

---
 impl/src/fmt.rs   | 18 +++++++++++-------
 impl/src/unraw.rs |  4 ++++
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/impl/src/fmt.rs b/impl/src/fmt.rs
index 5c0ff50..1da28c1 100644
--- a/impl/src/fmt.rs
+++ b/impl/src/fmt.rs
@@ -107,12 +107,14 @@ impl Display<'_> {
                 }
             };
             infinite_recursive |= member == *"self" && bound == Trait::Display;
-            if let Some(&field) = member_index.get(&member) {
-                implied_bounds.insert((field, bound));
-            } else {
-                out += &member.to_string();
-                continue;
-            }
+            let field = match member_index.get(&member) {
+                Some(&field) => field,
+                None => {
+                    out += &member.to_string();
+                    continue;
+                }
+            };
+            implied_bounds.insert((field, bound));
             let formatvar_prefix = if bonus_display {
                 "__display"
             } else if bound == Trait::Pointer {
@@ -129,15 +131,17 @@ impl Display<'_> {
             while user_named_args.contains(&formatvar) {
                 formatvar = IdentUnraw::new(format_ident!("_{}", formatvar.to_string()));
             }
+            formatvar.set_span(span);
             out += &formatvar.to_string();
             if !macro_named_args.insert(formatvar.clone()) {
                 // Already added to bindings by a previous use.
                 continue;
             }
-            let binding_value = match &member {
+            let mut binding_value = match &member {
                 MemberUnraw::Unnamed(index) => format_ident!("_{}", index),
                 MemberUnraw::Named(ident) => ident.to_local(),
             };
+            binding_value.set_span(span.resolved_at(fields[field].member.span()));
             let wrapped_binding_value = if bonus_display {
                 quote_spanned!(span=> #binding_value.as_display())
             } else if bound == Trait::Pointer {
diff --git a/impl/src/unraw.rs b/impl/src/unraw.rs
index a232621..73b9970 100644
--- a/impl/src/unraw.rs
+++ b/impl/src/unraw.rs
@@ -28,6 +28,10 @@ impl IdentUnraw {
         }
         unraw
     }
+
+    pub fn set_span(&mut self, span: Span) {
+        self.0.set_span(span);
+    }
 }
 
 impl Display for IdentUnraw {