about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2025-05-24 17:48:21 +0000
committerbors <bors@rust-lang.org>2025-05-24 17:48:21 +0000
commit5e16c662062fd6dee91f0fe2a1580483488d80cf (patch)
treefbf66157c5f6e9ee47c9fcb552de2696772bc92e
parent038d599eda4fe3e3d78103fba51ee663df86dadf (diff)
parent9c234c03fd2d4121147a860ee3430f875fd6d2d2 (diff)
downloadrust-5e16c662062fd6dee91f0fe2a1580483488d80cf.tar.gz
rust-5e16c662062fd6dee91f0fe2a1580483488d80cf.zip
Auto merge of #141372 - khuey:ir_call_dbg_loc, r=jieyouxu
Use the fn_span when emitting function calls for better debug info.

This especially improves the developer experience for long chains of function calls that span multiple lines, which is common with builder patterns, chains of iterator/future combinators, etc.

try-job: armhf-gnu
try-job: test-various
try-job: x86_64-msvc-1
try-job: arm-android

r? `@jieyouxu`
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/block.rs1
-rw-r--r--tests/debuginfo/multiline-calls.rs35
-rw-r--r--tests/ui/panics/location-detail-unwrap-multiline.rs12
3 files changed, 48 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/block.rs b/compiler/rustc_codegen_ssa/src/mir/block.rs
index 950f19a6f0f..600d6ff6801 100644
--- a/compiler/rustc_codegen_ssa/src/mir/block.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/block.rs
@@ -1181,6 +1181,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
             (_, Some(llfn)) => llfn,
             _ => span_bug!(span, "no instance or llfn for call"),
         };
+        self.set_debug_loc(bx, mir::SourceInfo { span: fn_span, ..source_info });
         helper.do_call(
             self,
             bx,
diff --git a/tests/debuginfo/multiline-calls.rs b/tests/debuginfo/multiline-calls.rs
new file mode 100644
index 00000000000..724ad29729f
--- /dev/null
+++ b/tests/debuginfo/multiline-calls.rs
@@ -0,0 +1,35 @@
+//@ compile-flags:-g
+//@ min-gdb-version: 16.0
+
+// === GDB TESTS ===================================================================================
+
+// gdb-command: run
+// gdb-check:[...]#break[...]
+// gdb-command: up
+// gdb-check:[...]zzz[...]
+
+// === LLDB TESTS ==================================================================================
+
+// lldb-command:run
+// lldb-check:[...]#break[...]
+// lldb-command: up
+// lldb-check:[...]zzz[...]
+
+struct Foo;
+
+impl Foo {
+    fn bar(self) -> Foo {
+        println!("bar");
+        self
+    }
+    fn baz(self) -> Foo {
+        println!("baz"); // #break
+        self
+    }
+}
+
+fn main() {
+    let f = Foo;
+    f.bar()              // aaa
+        .baz();          // zzz
+}
diff --git a/tests/ui/panics/location-detail-unwrap-multiline.rs b/tests/ui/panics/location-detail-unwrap-multiline.rs
new file mode 100644
index 00000000000..56e1760d851
--- /dev/null
+++ b/tests/ui/panics/location-detail-unwrap-multiline.rs
@@ -0,0 +1,12 @@
+//@ run-fail
+//@ compile-flags: -Cstrip=none -Cdebuginfo=line-tables-only -Copt-level=0
+//@ exec-env:RUST_BACKTRACE=1
+//@ regex-error-pattern: location-detail-unwrap-multiline\.rs:11(:10)?\n
+//@ needs-unwind
+//@ ignore-android FIXME #17520
+
+fn main() {
+    let opt: Option<u32> = None;
+    opt
+        .unwrap();
+}