Rollup merge of #66098 - estebank:path-asciption-typo, r=Centril
Detect `::` -> `:` typo when involving turbofish Fix #65569.
This commit is contained in:
commit
409b2bf941
4 changed files with 30 additions and 4 deletions
|
|
@ -360,11 +360,11 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
pub fn maybe_annotate_with_ascription(
|
||||
&self,
|
||||
&mut self,
|
||||
err: &mut DiagnosticBuilder<'_>,
|
||||
maybe_expected_semicolon: bool,
|
||||
) {
|
||||
if let Some((sp, likely_path)) = self.last_type_ascription {
|
||||
if let Some((sp, likely_path)) = self.last_type_ascription.take() {
|
||||
let sm = self.sess.source_map();
|
||||
let next_pos = sm.lookup_char_pos(self.token.span.lo());
|
||||
let op_pos = sm.lookup_char_pos(sp.hi());
|
||||
|
|
@ -1088,8 +1088,15 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
pub(super) fn could_ascription_be_path(&self, node: &ast::ExprKind) -> bool {
|
||||
self.token.is_ident() &&
|
||||
if let ast::ExprKind::Path(..) = node { true } else { false } &&
|
||||
(self.token == token::Lt && // `foo:<bar`, likely a typoed turbofish.
|
||||
self.look_ahead(1, |t| t.is_ident() && !t.is_reserved_ident())
|
||||
) ||
|
||||
self.token.is_ident() &&
|
||||
match node {
|
||||
// `foo::` → `foo:` or `foo.bar::` → `foo.bar:`
|
||||
ast::ExprKind::Path(..) | ast::ExprKind::Field(..) => true,
|
||||
_ => false,
|
||||
} &&
|
||||
!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<baz`
|
||||
|
|
|
|||
|
|
@ -397,6 +397,7 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
let stmt = match self.parse_full_stmt(false) {
|
||||
Err(mut err) => {
|
||||
self.maybe_annotate_with_ascription(&mut err, false);
|
||||
err.emit();
|
||||
self.recover_stmt_(SemiColonMode::Ignore, BlockMode::Ignore);
|
||||
Some(Stmt {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
fn main() -> Result<(), ()> {
|
||||
vec![Ok(2)].into_iter().collect:<Result<Vec<_>,_>>()?;
|
||||
//~^ ERROR expected `::`, found `(`
|
||||
Ok(())
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
error: expected `::`, found `(`
|
||||
--> $DIR/type-ascription-instead-of-path-2.rs:2:55
|
||||
|
|
||||
LL | vec![Ok(2)].into_iter().collect:<Result<Vec<_>,_>>()?;
|
||||
| - ^ expected `::`
|
||||
| |
|
||||
| help: maybe write a path separator here: `::`
|
||||
|
|
||||
= note: `#![feature(type_ascription)]` lets you annotate an expression with a type: `<expr>: <type>`
|
||||
= note: for more information, see https://github.com/rust-lang/rust/issues/23416
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue