Rollup merge of #109307 - cjgillot:inline-location, r=compiler-errors
Ignore `Inlined` spans when computing caller location. Fixes https://github.com/rust-lang/rust/issues/105538
This commit is contained in:
commit
3efecba6e7
5 changed files with 37 additions and 5 deletions
|
@ -1475,7 +1475,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
) -> OperandRef<'tcx, Bx::Value> {
|
) -> OperandRef<'tcx, Bx::Value> {
|
||||||
let tcx = bx.tcx();
|
let tcx = bx.tcx();
|
||||||
|
|
||||||
let mut span_to_caller_location = |span: Span| {
|
let mut span_to_caller_location = |mut span: Span| {
|
||||||
|
// Remove `Inlined` marks as they pollute `expansion_cause`.
|
||||||
|
while span.is_inlined() {
|
||||||
|
span.remove_mark();
|
||||||
|
}
|
||||||
let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span);
|
let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span);
|
||||||
let caller = tcx.sess.source_map().lookup_char_pos(topmost.lo());
|
let caller = tcx.sess.source_map().lookup_char_pos(topmost.lo());
|
||||||
let const_loc = tcx.const_caller_location((
|
let const_loc = tcx.const_caller_location((
|
||||||
|
|
|
@ -111,7 +111,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
location
|
location
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn location_triple_for_span(&self, span: Span) -> (Symbol, u32, u32) {
|
pub(crate) fn location_triple_for_span(&self, mut span: Span) -> (Symbol, u32, u32) {
|
||||||
|
// Remove `Inlined` marks as they pollute `expansion_cause`.
|
||||||
|
while span.is_inlined() {
|
||||||
|
span.remove_mark();
|
||||||
|
}
|
||||||
let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span);
|
let topmost = span.ctxt().outer_expn().expansion_cause().unwrap_or(span);
|
||||||
let caller = self.tcx.sess.source_map().lookup_char_pos(topmost.lo());
|
let caller = self.tcx.sess.source_map().lookup_char_pos(topmost.lo());
|
||||||
(
|
(
|
||||||
|
|
|
@ -880,7 +880,7 @@ impl Span {
|
||||||
pub fn fresh_expansion(self, expn_id: LocalExpnId) -> Span {
|
pub fn fresh_expansion(self, expn_id: LocalExpnId) -> Span {
|
||||||
HygieneData::with(|data| {
|
HygieneData::with(|data| {
|
||||||
self.with_ctxt(data.apply_mark(
|
self.with_ctxt(data.apply_mark(
|
||||||
SyntaxContext::root(),
|
self.ctxt(),
|
||||||
expn_id.to_expn_id(),
|
expn_id.to_expn_id(),
|
||||||
Transparency::Transparent,
|
Transparency::Transparent,
|
||||||
))
|
))
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
// revisions: default mir-opt
|
// revisions: default mir-opt
|
||||||
|
//[default] compile-flags: -Zinline-mir=no
|
||||||
//[mir-opt] compile-flags: -Zmir-opt-level=4
|
//[mir-opt] compile-flags: -Zmir-opt-level=4
|
||||||
|
|
||||||
macro_rules! caller_location_from_macro {
|
macro_rules! caller_location_from_macro {
|
||||||
|
@ -9,13 +10,13 @@ macro_rules! caller_location_from_macro {
|
||||||
fn main() {
|
fn main() {
|
||||||
let loc = core::panic::Location::caller();
|
let loc = core::panic::Location::caller();
|
||||||
assert_eq!(loc.file(), file!());
|
assert_eq!(loc.file(), file!());
|
||||||
assert_eq!(loc.line(), 10);
|
assert_eq!(loc.line(), 11);
|
||||||
assert_eq!(loc.column(), 15);
|
assert_eq!(loc.column(), 15);
|
||||||
|
|
||||||
// `Location::caller()` in a macro should behave similarly to `file!` and `line!`,
|
// `Location::caller()` in a macro should behave similarly to `file!` and `line!`,
|
||||||
// i.e. point to where the macro was invoked, instead of the macro itself.
|
// i.e. point to where the macro was invoked, instead of the macro itself.
|
||||||
let loc2 = caller_location_from_macro!();
|
let loc2 = caller_location_from_macro!();
|
||||||
assert_eq!(loc2.file(), file!());
|
assert_eq!(loc2.file(), file!());
|
||||||
assert_eq!(loc2.line(), 17);
|
assert_eq!(loc2.line(), 18);
|
||||||
assert_eq!(loc2.column(), 16);
|
assert_eq!(loc2.column(), 16);
|
||||||
}
|
}
|
||||||
|
|
23
tests/ui/rfc-2091-track-caller/mir-inlined-macro.rs
Normal file
23
tests/ui/rfc-2091-track-caller/mir-inlined-macro.rs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
// run-pass
|
||||||
|
// revisions: default mir-opt
|
||||||
|
//[default] compile-flags: -Zinline-mir=no
|
||||||
|
//[mir-opt] compile-flags: -Zmir-opt-level=4
|
||||||
|
|
||||||
|
use std::panic::Location;
|
||||||
|
|
||||||
|
macro_rules! f {
|
||||||
|
() => {
|
||||||
|
Location::caller()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
fn g() -> &'static Location<'static> {
|
||||||
|
f!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let loc = g();
|
||||||
|
assert_eq!(loc.line(), 16);
|
||||||
|
assert_eq!(loc.column(), 5);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue