Don't print the macro definition site in backtraces

This halves the backtrace length. The definition site wasn't very useful
anyways, since it may be invalid (for compiler expansions) or located in
another crate. Since the macro name is still printed, grepping for it is
still an easy way of finding the definition.
This commit is contained in:
Jonas Schievink
2015-09-10 22:25:28 +02:00
parent 49d8b0dcbe
commit 31fa44b18e
6 changed files with 21 additions and 22 deletions

View File

@@ -732,21 +732,17 @@ impl EmitterWriter {
sp_opt = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> { sp_opt = try!(cm.with_expn_info(sp.expn_id, |expn_info| -> io::Result<_> {
match expn_info { match expn_info {
Some(ei) => { Some(ei) => {
let ss = ei.callee.span.map_or(String::new(),
|span| cm.span_to_string(span));
let (pre, post) = match ei.callee.format { let (pre, post) = match ei.callee.format {
codemap::MacroAttribute(..) => ("#[", "]"), codemap::MacroAttribute(..) => ("#[", "]"),
codemap::MacroBang(..) => ("", "!"), codemap::MacroBang(..) => ("", "!"),
codemap::CompilerExpansion(..) => ("", ""), codemap::CompilerExpansion(..) => ("", ""),
}; };
try!(self.print_diagnostic(&ss, Note, try!(self.print_diagnostic(&cm.span_to_string(ei.call_site), Note,
&format!("in expansion of {}{}{}", &format!("in this expansion of {}{}{}",
pre, pre,
ei.callee.name(), ei.callee.name(),
post), post),
None)); None));
let ss = cm.span_to_string(ei.call_site);
try!(self.print_diagnostic(&ss, Note, "expansion site", None));
Ok(Some(ei.call_site)) Ok(Some(ei.call_site))
} }
None => Ok(None) None => Ok(None)

View File

@@ -10,7 +10,7 @@
// Test that we get an expansion stack for `for` loops. // Test that we get an expansion stack for `for` loops.
// error-pattern:in expansion of for loop expansion // error-pattern:in this expansion of for loop expansion
fn main() { fn main() {
for t in &foo { for t in &foo {

View File

@@ -10,25 +10,25 @@
// Macros in statement vs expression position handle backtraces differently. // Macros in statement vs expression position handle backtraces differently.
macro_rules! fake_method_stmt { //~ NOTE in expansion of macro_rules! fake_method_stmt {
() => { () => {
1.fake() //~ ERROR no method named `fake` found 1.fake() //~ ERROR no method named `fake` found
} }
} }
macro_rules! fake_field_stmt { //~ NOTE in expansion of macro_rules! fake_field_stmt {
() => { () => {
1.fake //~ ERROR no field with that name 1.fake //~ ERROR no field with that name
} }
} }
macro_rules! fake_anon_field_stmt { //~ NOTE in expansion of macro_rules! fake_anon_field_stmt {
() => { () => {
(1).0 //~ ERROR type was not a tuple (1).0 //~ ERROR type was not a tuple
} }
} }
macro_rules! fake_method_expr { //~ NOTE in expansion of macro_rules! fake_method_expr {
() => { () => {
1.fake() //~ ERROR no method named `fake` found 1.fake() //~ ERROR no method named `fake` found
} }
@@ -47,11 +47,13 @@ macro_rules! fake_anon_field_expr {
} }
fn main() { fn main() {
fake_method_stmt!(); //~ NOTE expansion site fake_method_stmt!(); //~ NOTE in this expansion of
fake_field_stmt!(); //~ NOTE expansion site fake_field_stmt!(); //~ NOTE in this expansion of
fake_anon_field_stmt!(); //~ NOTE expansion site fake_anon_field_stmt!(); //~ NOTE in this expansion of
let _ = fake_method_expr!(); //~ NOTE expansion site let _ = fake_method_expr!(); //~ NOTE in this expansion of
let _ = fake_field_expr!(); //~ ERROR no field with that name let _ = fake_field_expr!(); //~ ERROR no field with that name
//~^ NOTE in this expansion of
let _ = fake_anon_field_expr!(); //~ ERROR type was not a tuple let _ = fake_anon_field_expr!(); //~ ERROR type was not a tuple
//~^ NOTE in this expansion of
} }

View File

@@ -19,11 +19,11 @@ macro_rules! call_nested_expr {
() => (nested_expr!()) () => (nested_expr!())
} }
macro_rules! call_nested_expr_sum { //~ NOTE in expansion of macro_rules! call_nested_expr_sum {
() => { 1 + nested_expr!(); } //~ ERROR unresolved name () => { 1 + nested_expr!(); } //~ ERROR unresolved name
} }
fn main() { fn main() {
1 + call_nested_expr!(); //~ ERROR unresolved name 1 + call_nested_expr!(); //~ ERROR unresolved name
call_nested_expr_sum!(); //~ NOTE expansion site call_nested_expr_sum!(); //~ NOTE in this expansion of
} }

View File

@@ -16,14 +16,15 @@
fn print(_args: std::fmt::Arguments) {} fn print(_args: std::fmt::Arguments) {}
macro_rules! myprint { //~ NOTE in expansion of macro_rules! myprint {
($($arg:tt)*) => (print(format_args!($($arg)*))); ($($arg:tt)*) => (print(format_args!($($arg)*))); //~ NOTE in this expansion of
} }
macro_rules! myprintln { //~ NOTE in expansion of macro_rules! myprintln {
($fmt:expr) => (myprint!(concat!($fmt, "\n"))); //~ ERROR invalid reference to argument `0` ($fmt:expr) => (myprint!(concat!($fmt, "\n"))); //~ ERROR invalid reference to argument `0`
//~^ NOTE in this expansion of
} }
fn main() { fn main() {
myprintln!("{}"); //~ NOTE expansion site myprintln!("{}"); //~ NOTE in this expansion of
} }

View File

@@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
// forbid-output: in expansion of // forbid-output: in this expansion of
macro_rules! make_method { macro_rules! make_method {
($name:ident) => ( fn $name(&self) { } ) ($name:ident) => ( fn $name(&self) { } )