diff --git a/src/librustc_passes/ast_validation.rs b/src/librustc_passes/ast_validation.rs index 6275639a9adff..5096a574e2ba5 100644 --- a/src/librustc_passes/ast_validation.rs +++ b/src/librustc_passes/ast_validation.rs @@ -53,8 +53,11 @@ impl<'a> AstValidator<'a> { span, E0449, "unnecessary visibility qualifier"); + if vis == &Visibility::Public { + err.span_label(span, &format!("`pub` not needed here")); + } if let Some(note) = note { - err.span_note(span, note); + err.note(note); } err.emit(); } diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 1b119fd008509..b214608fbe9c9 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -972,8 +972,10 @@ impl<'a, 'tcx: 'a, 'v> Visitor<'v> for SearchInterfaceForPrivateItemsVisitor<'a, if !vis.is_at_least(self.required_visibility, &self.tcx.map) { if self.tcx.sess.features.borrow().pub_restricted || self.old_error_set.contains(&ty.id) { - span_err!(self.tcx.sess, ty.span, E0446, + let mut err = struct_span_err!(self.tcx.sess, ty.span, E0446, "private type in public interface"); + err.span_label(ty.span, &format!("private type can't be public")); + err.emit(); } else { self.tcx.sess.add_lint(lint::builtin::PRIVATE_IN_PUBLIC, node_id, diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index fb9819b72ab3e..38b31db678143 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -366,9 +366,14 @@ fn resolve_struct_error<'b, 'a: 'b, 'c>(resolver: &'b Resolver<'a>, let mut err = struct_span_err!(resolver.session, span, E0425, - "unresolved name `{}`{}", - path, - msg); + "unresolved name `{}`", + path); + if msg != "" { + err.span_label(span, &msg); + } else { + err.span_label(span, &format!("unresolved name")); + } + match context { UnresolvedNameContext::Other => { if msg.is_empty() && is_static_method && is_field { @@ -2941,7 +2946,7 @@ impl<'a> Resolver<'a> { let mut context = UnresolvedNameContext::Other; let mut def = Def::Err; if !msg.is_empty() { - msg = format!(". Did you mean {}?", msg); + msg = format!("did you mean {}?", msg); } else { // we display a help message if this is a module let name_path = path.segments.iter() diff --git a/src/test/compile-fail/E0033.rs b/src/test/compile-fail/E0033.rs index d320bcd4d0f55..44f73e10e25d3 100644 --- a/src/test/compile-fail/E0033.rs +++ b/src/test/compile-fail/E0033.rs @@ -15,6 +15,7 @@ trait SomeTrait { fn main() { let trait_obj: &SomeTrait = SomeTrait; //~^ ERROR E0425 + //~| NOTE unresolved name //~| ERROR E0038 //~| method `foo` has no receiver //~| NOTE the trait `SomeTrait` cannot be made into an object diff --git a/src/test/compile-fail/E0446.rs b/src/test/compile-fail/E0446.rs index c576661828471..fe8a50bc618ed 100644 --- a/src/test/compile-fail/E0446.rs +++ b/src/test/compile-fail/E0446.rs @@ -12,6 +12,7 @@ mod Foo { struct Bar(u32); pub fn bar() -> Bar { //~ ERROR E0446 + //~| NOTE private type can't be public Bar(0) } } diff --git a/src/test/compile-fail/E0449.rs b/src/test/compile-fail/E0449.rs index ac365db33e5cd..0b3fdb9e6abe6 100644 --- a/src/test/compile-fail/E0449.rs +++ b/src/test/compile-fail/E0449.rs @@ -15,9 +15,13 @@ trait Foo { } pub impl Bar {} //~ ERROR E0449 + //~| NOTE `pub` not needed here + //~| NOTE place qualifiers on individual impl items instead pub impl Foo for Bar { //~ ERROR E0449 + //~| NOTE `pub` not needed here pub fn foo() {} //~ ERROR E0449 + //~| NOTE `pub` not needed here } fn main() { diff --git a/src/test/compile-fail/bad-expr-path.rs b/src/test/compile-fail/bad-expr-path.rs index c35c9255ed28e..c18a318347745 100644 --- a/src/test/compile-fail/bad-expr-path.rs +++ b/src/test/compile-fail/bad-expr-path.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// error-pattern: unresolved name `m1::arguments`. Did you mean `arguments`? +// error-pattern: unresolved name `m1::arguments` mod m1 {} diff --git a/src/test/compile-fail/bad-expr-path2.rs b/src/test/compile-fail/bad-expr-path2.rs index af34887dec954..e1c1afb0049d7 100644 --- a/src/test/compile-fail/bad-expr-path2.rs +++ b/src/test/compile-fail/bad-expr-path2.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// error-pattern: unresolved name `m1::arguments`. Did you mean `arguments`? +// error-pattern: unresolved name `m1::arguments` mod m1 { pub mod arguments {} diff --git a/src/test/compile-fail/issue-14254.rs b/src/test/compile-fail/issue-14254.rs index 5f8ccd0b0634e..c7bd343bc9a33 100644 --- a/src/test/compile-fail/issue-14254.rs +++ b/src/test/compile-fail/issue-14254.rs @@ -27,87 +27,111 @@ impl BarTy { impl Foo for *const BarTy { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? a; //~^ ERROR: unresolved name `a` + //~| NOTE unresolved name } } impl<'a> Foo for &'a BarTy { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? x; - //~^ ERROR: unresolved name `x`. Did you mean `self.x`? + //~^ ERROR: unresolved name `x` + //~| NOTE did you mean `self.x`? y; - //~^ ERROR: unresolved name `y`. Did you mean `self.y`? + //~^ ERROR: unresolved name `y` + //~| NOTE did you mean `self.y`? a; //~^ ERROR: unresolved name `a` + //~| NOTE unresolved name bah; - //~^ ERROR: unresolved name `bah`. Did you mean to call `Foo::bah`? + //~^ ERROR: unresolved name `bah` + //~| NOTE did you mean to call `Foo::bah`? b; //~^ ERROR: unresolved name `b` + //~| NOTE unresolved name } } impl<'a> Foo for &'a mut BarTy { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? x; - //~^ ERROR: unresolved name `x`. Did you mean `self.x`? + //~^ ERROR: unresolved name `x` + //~| NOTE did you mean `self.x`? y; - //~^ ERROR: unresolved name `y`. Did you mean `self.y`? + //~^ ERROR: unresolved name `y` + //~| NOTE did you mean `self.y`? a; //~^ ERROR: unresolved name `a` + //~| NOTE unresolved name bah; - //~^ ERROR: unresolved name `bah`. Did you mean to call `Foo::bah`? + //~^ ERROR: unresolved name `bah` + //~| NOTE did you mean to call `Foo::bah`? b; //~^ ERROR: unresolved name `b` + //~| NOTE unresolved name } } impl Foo for Box { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? bah; - //~^ ERROR: unresolved name `bah`. Did you mean to call `Foo::bah`? + //~^ ERROR: unresolved name `bah` + //~| NOTE did you mean to call `Foo::bah`? } } impl Foo for *const isize { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? bah; - //~^ ERROR: unresolved name `bah`. Did you mean to call `Foo::bah`? + //~^ ERROR: unresolved name `bah` + //~| NOTE did you mean to call `Foo::bah`? } } impl<'a> Foo for &'a isize { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? bah; - //~^ ERROR: unresolved name `bah`. Did you mean to call `Foo::bah`? + //~^ ERROR: unresolved name `bah` + //~| NOTE did you mean to call `Foo::bah`? } } impl<'a> Foo for &'a mut isize { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? bah; - //~^ ERROR: unresolved name `bah`. Did you mean to call `Foo::bah`? + //~^ ERROR: unresolved name `bah` + //~| NOTE did you mean to call `Foo::bah`? } } impl Foo for Box { fn bar(&self) { baz(); - //~^ ERROR: unresolved name `baz`. Did you mean to call `self.baz`? + //~^ ERROR: unresolved name `baz` + //~| NOTE did you mean to call `self.baz`? bah; - //~^ ERROR: unresolved name `bah`. Did you mean to call `Foo::bah`? + //~^ ERROR: unresolved name `bah` + //~| NOTE did you mean to call `Foo::bah`? } } diff --git a/src/test/compile-fail/issue-2356.rs b/src/test/compile-fail/issue-2356.rs index da92161967dbd..d7635d7bc9473 100644 --- a/src/test/compile-fail/issue-2356.rs +++ b/src/test/compile-fail/issue-2356.rs @@ -26,6 +26,7 @@ impl MaybeDog { // If this provides a suggestion, it's a bug as MaybeDog doesn't impl Groom shave(); //~^ ERROR: unresolved name `shave` + //~| NOTE unresolved name } } @@ -33,11 +34,14 @@ impl Groom for cat { fn shave(other: usize) { whiskers -= other; //~^ ERROR: unresolved name `whiskers` + //~| NOTE unresolved name //~| HELP this is an associated function shave(4); - //~^ ERROR: unresolved name `shave`. Did you mean to call `Groom::shave`? + //~^ ERROR: unresolved name `shave` + //~| NOTE did you mean to call `Groom::shave`? purr(); //~^ ERROR: unresolved name `purr` + //~| NOTE unresolved name } } @@ -47,12 +51,16 @@ impl cat { fn purr_louder() { static_method(); //~^ ERROR: unresolved name `static_method` + //~| NOTE unresolved name purr(); //~^ ERROR: unresolved name `purr` + //~| NOTE unresolved name purr(); //~^ ERROR: unresolved name `purr` + //~| NOTE unresolved name purr(); //~^ ERROR: unresolved name `purr` + //~| NOTE unresolved name } } @@ -69,27 +77,33 @@ impl cat { fn purr(&self) { grow_older(); //~^ ERROR: unresolved name `grow_older` + //~| NOTE unresolved name shave(); //~^ ERROR: unresolved name `shave` + //~| NOTE unresolved name } fn burn_whiskers(&mut self) { whiskers = 0; - //~^ ERROR: unresolved name `whiskers`. Did you mean `self.whiskers`? + //~^ ERROR: unresolved name `whiskers` + //~| NOTE did you mean `self.whiskers`? } pub fn grow_older(other:usize) { whiskers = 4; //~^ ERROR: unresolved name `whiskers` + //~| NOTE unresolved name //~| HELP this is an associated function purr_louder(); //~^ ERROR: unresolved name `purr_louder` + //~| NOTE unresolved name } } fn main() { self += 1; //~^ ERROR: unresolved name `self` + //~| NOTE unresolved name //~| HELP: module `self` // it's a bug if this suggests a missing `self` as we're not in a method } diff --git a/src/test/compile-fail/resolve-hint-macro.rs b/src/test/compile-fail/resolve-hint-macro.rs index f05f1cd544a10..edaab01275712 100644 --- a/src/test/compile-fail/resolve-hint-macro.rs +++ b/src/test/compile-fail/resolve-hint-macro.rs @@ -9,5 +9,7 @@ // except according to those terms. fn main() { - assert(true); //~ERROR unresolved name `assert`. Did you mean the macro `assert!`? + assert(true); + //~^ ERROR unresolved name `assert` + //~| NOTE did you mean the macro `assert!`? } diff --git a/src/test/compile-fail/token-error-correct-2.rs b/src/test/compile-fail/token-error-correct-2.rs index ab429ab878073..151c1d432ed36 100644 --- a/src/test/compile-fail/token-error-correct-2.rs +++ b/src/test/compile-fail/token-error-correct-2.rs @@ -13,5 +13,6 @@ fn main() { if foo { //~ NOTE: unclosed delimiter //~^ ERROR: unresolved name `foo` + //~| NOTE unresolved name ) //~ ERROR: incorrect close delimiter: `)` } diff --git a/src/test/compile-fail/token-error-correct-3.rs b/src/test/compile-fail/token-error-correct-3.rs index 24627e9420874..5f21bf18d7b1b 100644 --- a/src/test/compile-fail/token-error-correct-3.rs +++ b/src/test/compile-fail/token-error-correct-3.rs @@ -19,6 +19,7 @@ pub mod raw { callback: F) -> io::Result { if !is_directory(path.as_ref()) { //~ ERROR: unresolved name `is_directory` + //~| NOTE unresolved name callback(path.as_ref(); //~ NOTE: unclosed delimiter //~^ ERROR: expected one of fs::create_dir_all(path.as_ref()).map(|()| true) //~ ERROR: mismatched types diff --git a/src/test/compile-fail/token-error-correct.rs b/src/test/compile-fail/token-error-correct.rs index f5fecf3e1740a..3ba9edda07f26 100644 --- a/src/test/compile-fail/token-error-correct.rs +++ b/src/test/compile-fail/token-error-correct.rs @@ -17,6 +17,8 @@ fn main() { //~^^^ ERROR: unresolved name `bar` //~^^^^ ERROR: unresolved name `foo` //~^^^^^ ERROR: expected one of `)`, `,`, `.`, `<`, `?` + //~| NOTE unresolved name + //~| NOTE unresolved name } //~ ERROR: incorrect close delimiter: `}` //~^ ERROR: incorrect close delimiter: `}` //~^^ ERROR: expected expression, found `)` diff --git a/src/test/ui/codemap_tests/tab.stderr b/src/test/ui/codemap_tests/tab.stderr index 543c02fb701f3..f865f0a5f23cd 100644 --- a/src/test/ui/codemap_tests/tab.stderr +++ b/src/test/ui/codemap_tests/tab.stderr @@ -2,7 +2,7 @@ error[E0425]: unresolved name `bar` --> $DIR/tab.rs:14:2 | 14 | \tbar; - | \t^^^ + | \t^^^ unresolved name error: aborting due to previous error diff --git a/src/test/ui/macros/macro-backtrace-nested.stderr b/src/test/ui/macros/macro-backtrace-nested.stderr index e452e8d69bdad..1c7fac894f976 100644 --- a/src/test/ui/macros/macro-backtrace-nested.stderr +++ b/src/test/ui/macros/macro-backtrace-nested.stderr @@ -2,7 +2,7 @@ error[E0425]: unresolved name `fake` --> $DIR/macro-backtrace-nested.rs:15:12 | 15 | () => (fake) - | ^^^^ + | ^^^^ unresolved name ... 27 | 1 + call_nested_expr!(); | ------------------- in this macro invocation @@ -11,7 +11,7 @@ error[E0425]: unresolved name `fake` --> $DIR/macro-backtrace-nested.rs:15:12 | 15 | () => (fake) - | ^^^^ + | ^^^^ unresolved name ... 28 | call_nested_expr_sum!(); | ------------------------ in this macro invocation diff --git a/src/test/compile-fail/typo-suggestion.rs b/src/test/ui/span/typo-suggestion.rs similarity index 87% rename from src/test/compile-fail/typo-suggestion.rs rename to src/test/ui/span/typo-suggestion.rs index d5cf6a294ee4d..536bf16142b30 100644 --- a/src/test/compile-fail/typo-suggestion.rs +++ b/src/test/ui/span/typo-suggestion.rs @@ -13,9 +13,7 @@ fn main() { // `foo` shouldn't be suggested, it is too dissimilar from `bar`. println!("Hello {}", bar); - //~^ ERROR: unresolved name `bar` // But this is close enough. println!("Hello {}", fob); - //~^ ERROR: unresolved name `fob`. Did you mean `foo`? } diff --git a/src/test/ui/span/typo-suggestion.stderr b/src/test/ui/span/typo-suggestion.stderr new file mode 100644 index 0000000000000..5446175aa2505 --- /dev/null +++ b/src/test/ui/span/typo-suggestion.stderr @@ -0,0 +1,14 @@ +error[E0425]: unresolved name `bar` + --> $DIR/typo-suggestion.rs:15:26 + | +15 | println!("Hello {}", bar); + | ^^^ unresolved name + +error[E0425]: unresolved name `fob` + --> $DIR/typo-suggestion.rs:18:26 + | +18 | println!("Hello {}", fob); + | ^^^ did you mean `foo`? + +error: aborting due to 2 previous errors +