about summary refs log tree commit diff
path: root/src/libsyntax/diagnostic.rs
diff options
context:
space:
mode:
authorJonas Schievink <jonas@schievink.net>2015-09-10 21:22:59 +0200
committerJonas Schievink <jonas@schievink.net>2015-09-10 21:22:59 +0200
commit49d8b0dcbef738b70f08b6648bb7c358b491f47c (patch)
tree20eb61d836c276ed1acd7624f886e88e2e4892e8 /src/libsyntax/diagnostic.rs
parent9577e426824d410e21147bec73b1c7d0a64f890d (diff)
downloadrust-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.rs48
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(())
     }
 }