diff --git a/src/librustc_parse/parser/diagnostics.rs b/src/librustc_parse/parser/diagnostics.rs index 7822c09739049..3244b35e89b0e 100644 --- a/src/librustc_parse/parser/diagnostics.rs +++ b/src/librustc_parse/parser/diagnostics.rs @@ -346,13 +346,16 @@ impl<'a> Parser<'a> { if allow_unstable { // Give extra information about type ascription only if it's a nightly compiler. err.note( - "`#![feature(type_ascription)]` lets you annotate an expression with a \ - type: `: `", - ); - err.note( - "see issue #23416 \ - for more information", + "`#![feature(type_ascription)]` lets you annotate an expression with a type: \ + `: `", ); + if !likely_path { + // Avoid giving too much info when it was likely an unrelated typo. + err.note( + "see issue #23416 \ + for more information", + ); + } } } } @@ -1161,8 +1164,10 @@ impl<'a> Parser<'a> { } && !self.token.is_reserved_ident() && // v `foo:bar(baz)` self.look_ahead(1, |t| t == &token::OpenDelim(token::Paren)) - || self.look_ahead(1, |t| t == &token::Lt) && // `foo:bar Resolver<'a> { suggestion: Option, span: Span, ) -> bool { - if let Some(suggestion) = suggestion { + let suggestion = match suggestion { + None => return false, // We shouldn't suggest underscore. - if suggestion.candidate == kw::Underscore { - return false; - } - - let msg = format!( - "{} {} with a similar name exists", - suggestion.res.article(), - suggestion.res.descr() - ); - err.span_suggestion( - span, - &msg, - suggestion.candidate.to_string(), - Applicability::MaybeIncorrect, - ); - let def_span = suggestion.res.opt_def_id().and_then(|def_id| match def_id.krate { - LOCAL_CRATE => self.opt_span(def_id), - _ => Some( - self.session - .source_map() - .guess_head_span(self.cstore().get_span_untracked(def_id, self.session)), + Some(suggestion) if suggestion.candidate == kw::Underscore => return false, + Some(suggestion) => suggestion, + }; + let msg = format!( + "{} {} with a similar name exists", + suggestion.res.article(), + suggestion.res.descr() + ); + err.span_suggestion( + span, + &msg, + suggestion.candidate.to_string(), + Applicability::MaybeIncorrect, + ); + let def_span = suggestion.res.opt_def_id().and_then(|def_id| match def_id.krate { + LOCAL_CRATE => self.opt_span(def_id), + _ => Some( + self.session + .source_map() + .guess_head_span(self.cstore().get_span_untracked(def_id, self.session)), + ), + }); + if let Some(span) = def_span { + err.span_label( + self.session.source_map().guess_head_span(span), + &format!( + "similarly named {} `{}` defined here", + suggestion.res.descr(), + suggestion.candidate.as_str(), ), - }); - if let Some(span) = def_span { - err.span_label( - self.session.source_map().guess_head_span(span), - &format!( - "similarly named {} `{}` defined here", - suggestion.res.descr(), - suggestion.candidate.as_str(), - ), - ); - } - return true; + ); } - false + true } fn binding_description(&self, b: &NameBinding<'_>, ident: Ident, from_prelude: bool) -> String { diff --git a/src/test/ui/lifetime_starts_expressions.stderr b/src/test/ui/lifetime_starts_expressions.stderr index 0d7980d60d62c..7275841ebb808 100644 --- a/src/test/ui/lifetime_starts_expressions.stderr +++ b/src/test/ui/lifetime_starts_expressions.stderr @@ -15,10 +15,9 @@ error: expected type, found keyword `loop` LL | loop { break 'label: loop { break 'label 42; }; } | - ^^^^ expected type | | - | tried to parse a type due to this type ascription + | help: maybe write a path separator here: `::` | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information error: aborting due to 2 previous errors diff --git a/src/test/ui/parser/issue-35813-postfix-after-cast.stderr b/src/test/ui/parser/issue-35813-postfix-after-cast.stderr index 255e9f409218b..9ccf17a6cb10e 100644 --- a/src/test/ui/parser/issue-35813-postfix-after-cast.stderr +++ b/src/test/ui/parser/issue-35813-postfix-after-cast.stderr @@ -280,12 +280,12 @@ error: casts cannot be followed by ? --> $DIR/issue-35813-postfix-after-cast.rs:121:5 | LL | Err(0u64): Result?; - | ^^^^^^^^^-^^^^^^^^^^^^^^^^ - | | - | help: maybe write a path separator here: `::` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information +help: try surrounding the expression in parentheses + | +LL | (Err(0u64): Result)?; + | ^ ^ error: casts cannot be followed by a function call --> $DIR/issue-35813-postfix-after-cast.rs:145:5 @@ -324,12 +324,12 @@ error: casts cannot be followed by `.await` --> $DIR/issue-35813-postfix-after-cast.rs:155:5 | LL | Box::pin(noop()): Pin>.await; - | ^^^^^^^^^^^^^^^^-^^^^^^^^^^^^ - | | - | help: maybe write a path separator here: `::` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: try surrounding the expression in parentheses | - = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information +LL | (Box::pin(noop()): Pin>).await; + | ^ ^ error: casts cannot be followed by a field access --> $DIR/issue-35813-postfix-after-cast.rs:167:5 diff --git a/src/test/ui/suggestions/type-ascription-instead-of-method.stderr b/src/test/ui/suggestions/type-ascription-instead-of-method.stderr index 998129ebd1d40..c111b4a9bc706 100644 --- a/src/test/ui/suggestions/type-ascription-instead-of-method.stderr +++ b/src/test/ui/suggestions/type-ascription-instead-of-method.stderr @@ -7,7 +7,6 @@ LL | Box:new("foo".to_string()) | help: maybe write a path separator here: `::` | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information error: aborting due to previous error diff --git a/src/test/ui/suggestions/type-ascription-instead-of-path-2.stderr b/src/test/ui/suggestions/type-ascription-instead-of-path-2.stderr index 0dd1494414fee..1d1999d350fe4 100644 --- a/src/test/ui/suggestions/type-ascription-instead-of-path-2.stderr +++ b/src/test/ui/suggestions/type-ascription-instead-of-path-2.stderr @@ -7,7 +7,6 @@ LL | vec![Ok(2)].into_iter().collect:,_>>()?; | help: maybe write a path separator here: `::` | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information error: aborting due to previous error diff --git a/src/test/ui/suggestions/type-ascription-instead-of-variant.stderr b/src/test/ui/suggestions/type-ascription-instead-of-variant.stderr index 5b40e16a51436..f38020dcc3820 100644 --- a/src/test/ui/suggestions/type-ascription-instead-of-variant.stderr +++ b/src/test/ui/suggestions/type-ascription-instead-of-variant.stderr @@ -7,7 +7,6 @@ LL | let _ = Option:Some(""); | help: maybe write a path separator here: `::` | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information error: aborting due to previous error diff --git a/src/test/ui/type/ascription/issue-47666.stderr b/src/test/ui/type/ascription/issue-47666.stderr index 3cd3be70aa75b..72c7c144b537d 100644 --- a/src/test/ui/type/ascription/issue-47666.stderr +++ b/src/test/ui/type/ascription/issue-47666.stderr @@ -10,7 +10,6 @@ LL | let _ = Option:Some(vec![0, 1]); | help: maybe write a path separator here: `::` | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0423]: expected value, found enum `Option` diff --git a/src/test/ui/type/ascription/issue-54516.stderr b/src/test/ui/type/ascription/issue-54516.stderr index fdf35700ef94c..ec08cf209c21a 100644 --- a/src/test/ui/type/ascription/issue-54516.stderr +++ b/src/test/ui/type/ascription/issue-54516.stderr @@ -7,7 +7,6 @@ LL | println!("{}", std::mem:size_of::>()); | help: maybe write a path separator here: `::` | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information error[E0423]: expected value, found module `std::mem` --> $DIR/issue-54516.rs:4:20 diff --git a/src/test/ui/type/ascription/issue-60933.stderr b/src/test/ui/type/ascription/issue-60933.stderr index cd9ae8f49f4f1..2006362e1bb7e 100644 --- a/src/test/ui/type/ascription/issue-60933.stderr +++ b/src/test/ui/type/ascription/issue-60933.stderr @@ -7,7 +7,6 @@ LL | let u: usize = std::mem:size_of::(); | help: maybe write a path separator here: `::` | = note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `: ` - = note: see issue #23416 for more information error[E0423]: expected value, found module `std::mem` --> $DIR/issue-60933.rs:2:20