diff --git a/src/librustc_codegen_ssa/mir/mod.rs b/src/librustc_codegen_ssa/mir/mod.rs index 1d40d004e2dd..dd69d3583131 100644 --- a/src/librustc_codegen_ssa/mir/mod.rs +++ b/src/librustc_codegen_ssa/mir/mod.rs @@ -128,14 +128,7 @@ pub fn debug_loc(&self, source_info: mir::SourceInfo) -> (Option, S // Walk up the macro expansion chain until we reach a non-expanded span. // We also stop at the function body level because no line stepping can occur // at the level above that. - let mut span = source_info.span; - while span.ctxt() != NO_EXPANSION && span.ctxt() != self.mir.span.ctxt() { - if let Some(info) = span.ctxt().outer_expn_info() { - span = info.call_site; - } else { - break; - } - } + let span = syntax_pos::hygiene::walk_chain(source_info.span, self.mir.span.ctxt()); let scope = self.scope_metadata_for_loc(source_info.scope, span.lo()); // Use span of the outermost expansion site, while keeping the original lexical scope. (scope, span) diff --git a/src/libsyntax_pos/hygiene.rs b/src/libsyntax_pos/hygiene.rs index 451ae5808f65..7ff7a9db4977 100644 --- a/src/libsyntax_pos/hygiene.rs +++ b/src/libsyntax_pos/hygiene.rs @@ -257,6 +257,17 @@ fn marks(&self, mut ctxt: SyntaxContext) -> Vec<(Mark, Transparency)> { marks } + fn walk_chain(&self, mut span: Span, to: SyntaxContext) -> Span { + while span.ctxt() != crate::NO_EXPANSION && span.ctxt() != to { + if let Some(info) = self.expn_info(self.outer(span.ctxt())) { + span = info.call_site; + } else { + break; + } + } + span + } + fn adjust(&self, ctxt: &mut SyntaxContext, expansion: Mark) -> Option { let mut scope = None; while !self.is_descendant_of(expansion, self.outer(*ctxt)) { @@ -366,6 +377,10 @@ pub fn clear_markings() { HygieneData::with(|data| data.markings = FxHashMap::default()); } +pub fn walk_chain(span: Span, to: SyntaxContext) -> Span { + HygieneData::with(|data| data.walk_chain(span, to)) +} + impl SyntaxContext { #[inline] pub const fn empty() -> Self {