]> git.lizzy.rs Git - rust.git/commitdiff
Don't print duplicate macro backtrace frames
authorJonas Schievink <jonas@schievink.net>
Fri, 11 Sep 2015 09:48:44 +0000 (11:48 +0200)
committerJonas Schievink <jonas@schievink.net>
Fri, 11 Sep 2015 09:48:44 +0000 (11:48 +0200)
src/libsyntax/diagnostic.rs

index c383f26b4e33da9bbf72218f15db76c1a88ba84a..c78086bda643224eb2b344723b5d5924232a76a4 100644 (file)
@@ -727,7 +727,9 @@ fn print_macro_backtrace(&mut self,
                              cm: &codemap::CodeMap,
                              sp: Span)
                              -> io::Result<()> {
+        let mut last_span = codemap::DUMMY_SP;
         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 {
@@ -737,12 +739,16 @@ fn print_macro_backtrace(&mut self,
                             codemap::MacroBang(..) => ("", "!"),
                             codemap::CompilerExpansion(..) => ("", ""),
                         };
-                        try!(self.print_diagnostic(&cm.span_to_string(ei.call_site), Note,
-                                                   &format!("in this expansion of {}{}{}",
-                                                            pre,
-                                                            ei.callee.name(),
-                                                            post),
-                                                   None));
+                        // Don't print recursive invocations
+                        if ei.call_site != last_span {
+                            last_span = ei.call_site;
+                            try!(self.print_diagnostic(&cm.span_to_string(ei.call_site), Note,
+                                                       &format!("in this expansion of {}{}{}",
+                                                                pre,
+                                                                ei.callee.name(),
+                                                                post),
+                                                       None));
+                        }
                         Ok(Some(ei.call_site))
                     }
                     None => Ok(None)