Skip to content

Commit 11a338a

Browse files
committed
Auto merge of #106139 - cjgillot:mir-inline-location, r=eholk
Give the correct track-caller location with MIR inlining. Fixes #105538
2 parents 6ad8383 + edc73f9 commit 11a338a

11 files changed

+24
-24
lines changed

compiler/rustc_mir_transform/src/inline.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ impl<'tcx> Inliner<'tcx> {
289289
) -> Option<CallSite<'tcx>> {
290290
// Only consider direct calls to functions
291291
let terminator = bb_data.terminator();
292-
if let TerminatorKind::Call { ref func, target, .. } = terminator.kind {
292+
if let TerminatorKind::Call { ref func, target, fn_span, .. } = terminator.kind {
293293
let func_ty = func.ty(caller_body, self.tcx);
294294
if let ty::FnDef(def_id, substs) = *func_ty.kind() {
295295
// To resolve an instance its substs have to be fully normalized.
@@ -302,14 +302,9 @@ impl<'tcx> Inliner<'tcx> {
302302
}
303303

304304
let fn_sig = self.tcx.bound_fn_sig(def_id).subst(self.tcx, substs);
305+
let source_info = SourceInfo { span: fn_span, ..terminator.source_info };
305306

306-
return Some(CallSite {
307-
callee,
308-
fn_sig,
309-
block: bb,
310-
target,
311-
source_info: terminator.source_info,
312-
});
307+
return Some(CallSite { callee, fn_sig, block: bb, target, source_info });
313308
}
314309
}
315310

compiler/rustc_span/src/hygiene.rs

+1
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ impl ExpnId {
316316
// Stop going up the backtrace once include! is encountered
317317
if expn_data.is_root()
318318
|| expn_data.kind == ExpnKind::Macro(MacroKind::Bang, sym::include)
319+
|| expn_data.kind == ExpnKind::Inlined
319320
{
320321
break;
321322
}

src/test/mir-opt/inline/inline_generator.main.Inline.diff

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
let mut _2: std::pin::Pin<&mut [generator@$DIR/inline_generator.rs:15:5: 15:8]>; // in scope 0 at $DIR/inline_generator.rs:+1:14: +1:32
88
let mut _3: &mut [generator@$DIR/inline_generator.rs:15:5: 15:8]; // in scope 0 at $DIR/inline_generator.rs:+1:23: +1:31
99
let mut _4: [generator@$DIR/inline_generator.rs:15:5: 15:8]; // in scope 0 at $DIR/inline_generator.rs:+1:28: +1:31
10-
+ let mut _7: bool; // in scope 0 at $DIR/inline_generator.rs:+1:14: +1:46
10+
+ let mut _7: bool; // in scope 0 at $DIR/inline_generator.rs:+1:33: +1:46
1111
scope 1 {
1212
debug _r => _1; // in scope 1 at $DIR/inline_generator.rs:+1:9: +1:11
1313
}
@@ -23,7 +23,7 @@
2323
+ }
2424
+ }
2525
+ }
26-
+ scope 6 (inlined g::{closure#0}) { // at $DIR/inline_generator.rs:9:14: 9:46
26+
+ scope 6 (inlined g::{closure#0}) { // at $DIR/inline_generator.rs:9:33: 9:46
2727
+ debug a => _7; // in scope 6 at $DIR/inline_generator.rs:15:6: 15:7
2828
+ let mut _8: i32; // in scope 6 at $DIR/inline_generator.rs:15:17: 15:39
2929
+ let mut _9: u32; // in scope 6 at $DIR/inline_generator.rs:15:5: 15:41
@@ -68,16 +68,16 @@
6868
- // mir::Constant
6969
- // + span: $DIR/inline_generator.rs:9:33: 9:39
7070
- // + literal: Const { ty: for<'a> fn(Pin<&'a mut [generator@$DIR/inline_generator.rs:15:5: 15:8]>, bool) -> GeneratorState<<[generator@$DIR/inline_generator.rs:15:5: 15:8] as Generator<bool>>::Yield, <[generator@$DIR/inline_generator.rs:15:5: 15:8] as Generator<bool>>::Return> {<[generator@$DIR/inline_generator.rs:15:5: 15:8] as Generator<bool>>::resume}, val: Value(<ZST>) }
71-
+ StorageLive(_7); // scope 0 at $DIR/inline_generator.rs:+1:14: +1:46
72-
+ _7 = const false; // scope 0 at $DIR/inline_generator.rs:+1:14: +1:46
71+
+ StorageLive(_7); // scope 0 at $DIR/inline_generator.rs:+1:33: +1:46
72+
+ _7 = const false; // scope 0 at $DIR/inline_generator.rs:+1:33: +1:46
7373
+ _10 = deref_copy (_2.0: &mut [generator@$DIR/inline_generator.rs:15:5: 15:8]); // scope 6 at $DIR/inline_generator.rs:15:5: 15:41
7474
+ _9 = discriminant((*_10)); // scope 6 at $DIR/inline_generator.rs:15:5: 15:41
7575
+ switchInt(move _9) -> [0: bb3, 1: bb8, 3: bb7, otherwise: bb9]; // scope 6 at $DIR/inline_generator.rs:15:5: 15:41
7676
}
7777

7878
- bb3: {
7979
+ bb1: {
80-
+ StorageDead(_7); // scope 0 at $DIR/inline_generator.rs:+1:14: +1:46
80+
+ StorageDead(_7); // scope 0 at $DIR/inline_generator.rs:+1:33: +1:46
8181
StorageDead(_2); // scope 0 at $DIR/inline_generator.rs:+1:45: +1:46
8282
StorageDead(_4); // scope 0 at $DIR/inline_generator.rs:+1:46: +1:47
8383
_0 = const (); // scope 0 at $DIR/inline_generator.rs:+0:11: +2:2

src/test/mir-opt/inline/inline_shims.clone.Inline.diff

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
debug f => _1; // in scope 0 at $DIR/inline_shims.rs:+0:20: +0:21
66
let mut _0: fn(A, B); // return place in scope 0 at $DIR/inline_shims.rs:+0:36: +0:44
77
let mut _2: &fn(A, B); // in scope 0 at $DIR/inline_shims.rs:+1:5: +1:14
8-
+ scope 1 (inlined <fn(A, B) as Clone>::clone - shim(fn(A, B))) { // at $DIR/inline_shims.rs:6:5: 6:14
8+
+ scope 1 (inlined <fn(A, B) as Clone>::clone - shim(fn(A, B))) { // at $DIR/inline_shims.rs:6:7: 6:14
99
+ }
1010

1111
bb0: {

src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.a.Inline.after.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ fn a(_1: &mut [T]) -> &mut [T] {
66
let mut _2: &mut [T]; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
77
let mut _3: &mut [T]; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
88
let mut _4: &mut [T]; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
9-
scope 1 (inlined <[T] as AsMut<[T]>>::as_mut) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:3:5: 3:15
9+
scope 1 (inlined <[T] as AsMut<[T]>>::as_mut) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:3:7: 3:15
1010
debug self => _4; // in scope 1 at $SRC_DIR/core/src/convert/mod.rs:LL:COL
1111
let mut _5: &mut [T]; // in scope 1 at $SRC_DIR/core/src/convert/mod.rs:LL:COL
1212
}

src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.b.Inline.after.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ fn b(_1: &mut Box<T>) -> &mut T {
66
let mut _2: &mut T; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
77
let mut _3: &mut T; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
88
let mut _4: &mut std::boxed::Box<T>; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
9-
scope 1 (inlined <Box<T> as AsMut<T>>::as_mut) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:8:5: 8:15
9+
scope 1 (inlined <Box<T> as AsMut<T>>::as_mut) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:8:7: 8:15
1010
debug self => _4; // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
1111
let mut _5: &mut T; // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
1212
let mut _6: &mut T; // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL

src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.c.Inline.after.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ fn c(_1: &[T]) -> &[T] {
55
let mut _0: &[T]; // return place in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+0:25: +0:29
66
let _2: &[T]; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
77
let mut _3: &[T]; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
8-
scope 1 (inlined <[T] as AsRef<[T]>>::as_ref) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:13:5: 13:15
8+
scope 1 (inlined <[T] as AsRef<[T]>>::as_ref) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:13:7: 13:15
99
debug self => _3; // in scope 1 at $SRC_DIR/core/src/convert/mod.rs:LL:COL
1010
}
1111

src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.d.Inline.after.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ fn d(_1: &Box<T>) -> &T {
55
let mut _0: &T; // return place in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+0:28: +0:30
66
let _2: &T; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
77
let mut _3: &std::boxed::Box<T>; // in scope 0 at $DIR/issue_58867_inline_as_ref_as_mut.rs:+1:5: +1:15
8-
scope 1 (inlined <Box<T> as AsRef<T>>::as_ref) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:18:5: 18:15
8+
scope 1 (inlined <Box<T> as AsRef<T>>::as_ref) { // at $DIR/issue_58867_inline_as_ref_as_mut.rs:18:7: 18:15
99
debug self => _3; // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
1010
let mut _4: std::boxed::Box<T>; // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
1111
let mut _5: *const T; // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL

src/test/mir-opt/issue_101973.inner.ConstProp.diff

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
debug out => _4; // in scope 2 at $DIR/issue_101973.rs:6:9: 6:16
2424
}
2525
}
26-
scope 3 (inlined core::num::<impl u32>::rotate_right) { // at $DIR/issue_101973.rs:14:5: 14:58
26+
scope 3 (inlined core::num::<impl u32>::rotate_right) { // at $DIR/issue_101973.rs:14:18: 14:58
2727
debug self => _4; // in scope 3 at $SRC_DIR/core/src/num/uint_macros.rs:LL:COL
2828
debug n => _6; // in scope 3 at $SRC_DIR/core/src/num/uint_macros.rs:LL:COL
2929
let mut _15: u32; // in scope 3 at $SRC_DIR/core/src/num/uint_macros.rs:LL:COL

src/test/mir-opt/issues/issue_59352.num_to_digit.PreCodegen.after.mir

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ fn num_to_digit(_1: char) -> u32 {
44
debug num => _1; // in scope 0 at $DIR/issue_59352.rs:+0:21: +0:24
55
let mut _0: u32; // return place in scope 0 at $DIR/issue_59352.rs:+0:35: +0:38
66
let mut _2: std::option::Option<u32>; // in scope 0 at $DIR/issue_59352.rs:+2:26: +2:41
7-
let mut _3: u32; // in scope 0 at $DIR/issue_59352.rs:+2:8: +2:23
7+
let mut _3: u32; // in scope 0 at $DIR/issue_59352.rs:+2:12: +2:23
88
let mut _9: isize; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL
9-
scope 1 (inlined char::methods::<impl char>::is_digit) { // at $DIR/issue_59352.rs:14:8: 14:23
9+
scope 1 (inlined char::methods::<impl char>::is_digit) { // at $DIR/issue_59352.rs:14:12: 14:23
1010
debug self => _1; // in scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
1111
debug radix => _3; // in scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
1212
let mut _4: &std::option::Option<u32>; // in scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
@@ -16,7 +16,7 @@ fn num_to_digit(_1: char) -> u32 {
1616
debug self => _4; // in scope 2 at $SRC_DIR/core/src/option.rs:LL:COL
1717
}
1818
}
19-
scope 3 (inlined #[track_caller] Option::<u32>::unwrap) { // at $DIR/issue_59352.rs:14:26: 14:50
19+
scope 3 (inlined #[track_caller] Option::<u32>::unwrap) { // at $DIR/issue_59352.rs:14:42: 14:50
2020
debug self => _2; // in scope 3 at $SRC_DIR/core/src/option.rs:LL:COL
2121
let mut _7: isize; // in scope 3 at $SRC_DIR/core/src/option.rs:LL:COL
2222
let mut _8: !; // in scope 3 at $SRC_DIR/core/src/option.rs:LL:COL
@@ -26,7 +26,7 @@ fn num_to_digit(_1: char) -> u32 {
2626
}
2727

2828
bb0: {
29-
StorageLive(_3); // scope 0 at $DIR/issue_59352.rs:+2:8: +2:23
29+
StorageLive(_3); // scope 0 at $DIR/issue_59352.rs:+2:12: +2:23
3030
StorageLive(_4); // scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
3131
StorageLive(_5); // scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
3232
StorageLive(_6); // scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
@@ -65,7 +65,7 @@ fn num_to_digit(_1: char) -> u32 {
6565
_9 = discriminant((*_4)); // scope 2 at $SRC_DIR/core/src/option.rs:LL:COL
6666
StorageDead(_4); // scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
6767
StorageDead(_5); // scope 1 at $SRC_DIR/core/src/char/methods.rs:LL:COL
68-
StorageDead(_3); // scope 0 at $DIR/issue_59352.rs:+2:8: +2:23
68+
StorageDead(_3); // scope 0 at $DIR/issue_59352.rs:+2:12: +2:23
6969
switchInt(move _9) -> [1: bb1, otherwise: bb3]; // scope 0 at $DIR/issue_59352.rs:+2:8: +2:23
7070
}
7171

src/test/ui/rfc-2091-track-caller/call-chain.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
// run-pass
2+
// revisions: default mir-opt
3+
//[default] compile-flags: -Zinline-mir=no
4+
//[mir-opt] compile-flags: -Zmir-opt-level=4
25

36
use std::panic::Location;
47

58
struct Foo;
69

710
impl Foo {
11+
#[inline(always)]
812
#[track_caller]
913
fn check_loc(&self, line: u32, col: u32) -> &Self {
1014
let loc = Location::caller();

0 commit comments

Comments
 (0)