diff options
| author | Jonas Schievink <jonas@schievink.net> | 2015-09-10 21:22:59 +0200 |
|---|---|---|
| committer | Jonas Schievink <jonas@schievink.net> | 2015-09-10 21:22:59 +0200 |
| commit | 49d8b0dcbef738b70f08b6648bb7c358b491f47c (patch) | |
| tree | 20eb61d836c276ed1acd7624f886e88e2e4892e8 /src/libsyntax/diagnostic.rs | |
| parent | 9577e426824d410e21147bec73b1c7d0a64f890d (diff) | |
| download | rust-49d8b0dcbef738b70f08b6648bb7c358b491f47c.tar.gz rust-49d8b0dcbef738b70f08b6648bb7c358b491f47c.zip | |
Make print_macro_backtrace non-recursive
Diffstat (limited to 'src/libsyntax/diagnostic.rs')
| -rw-r--r-- | src/libsyntax/diagnostic.rs | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs index 067e3fff3eb..1924368a7f5 100644 --- a/src/libsyntax/diagnostic.rs +++ b/src/libsyntax/diagnostic.rs @@ -727,30 +727,34 @@ impl EmitterWriter { cm: &codemap::CodeMap, sp: Span) -> io::Result<()> { - let cs = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> { - match expn_info { - Some(ei) => { - let ss = ei.callee.span.map_or(String::new(), - |span| cm.span_to_string(span)); - let (pre, post) = match ei.callee.format { - codemap::MacroAttribute(..) => ("#[", "]"), - codemap::MacroBang(..) => ("", "!"), - codemap::CompilerExpansion(..) => ("", ""), - }; - try!(self.print_diagnostic(&ss, Note, - &format!("in expansion of {}{}{}", - pre, - ei.callee.name(), - post), - None)); - let ss = cm.span_to_string(ei.call_site); - try!(self.print_diagnostic(&ss, Note, "expansion site", None)); - Ok(Some(ei.call_site)) + let mut sp_opt = Some(sp); + while let Some(sp) = sp_opt { + sp_opt = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> { + match expn_info { + Some(ei) => { + let ss = ei.callee.span.map_or(String::new(), + |span| cm.span_to_string(span)); + let (pre, post) = match ei.callee.format { + codemap::MacroAttribute(..) => ("#[", "]"), + codemap::MacroBang(..) => ("", "!"), + codemap::CompilerExpansion(..) => ("", ""), + }; + try!(self.print_diagnostic(&ss, Note, + &format!("in expansion of {}{}{}", + pre, + ei.callee.name(), + post), + None)); + let ss = cm.span_to_string(ei.call_site); + try!(self.print_diagnostic(&ss, Note, "expansion site", None)); + Ok(Some(ei.call_site)) + } + None => Ok(None) } - None => Ok(None) + })); } - })); - cs.map_or(Ok(()), |call_site| self.print_macro_backtrace(cm, call_site)) + + Ok(()) } } |
