1
Fork 0

Fix two incorrect turbofish suggestions

Fixes #121901
This commit is contained in:
Freya Arbjerg 2025-04-02 17:39:42 +02:00
parent ae9173d7dd
commit d8d27ca822
3 changed files with 58 additions and 7 deletions

View file

@ -2960,14 +2960,31 @@ impl<'a> Parser<'a> {
let parser_snapshot_before_ty = this.create_snapshot_for_diagnostic(); let parser_snapshot_before_ty = this.create_snapshot_for_diagnostic();
this.eat_incorrect_doc_comment_for_param_type(); this.eat_incorrect_doc_comment_for_param_type();
let mut ty = this.parse_ty_for_param(); let mut ty = this.parse_ty_for_param();
if ty.is_ok()
&& this.token != token::Comma if let Ok(t) = &ty {
// Check for trailing angle brackets
if let TyKind::Path(_, Path { segments, .. }) = &t.kind {
if let Some(segment) = segments.last() {
if let Some(guar) =
this.check_trailing_angle_brackets(segment, &[exp!(CloseParen)])
{
return Ok((
dummy_arg(segment.ident, guar),
Trailing::No,
UsePreAttrPos::No,
));
}
}
}
if this.token != token::Comma
&& this.token != token::CloseDelim(Delimiter::Parenthesis) && this.token != token::CloseDelim(Delimiter::Parenthesis)
{ {
// This wasn't actually a type, but a pattern looking like a type, // This wasn't actually a type, but a pattern looking like a type,
// so we are going to rollback and re-parse for recovery. // so we are going to rollback and re-parse for recovery.
ty = this.unexpected_any(); ty = this.unexpected_any();
} }
}
match ty { match ty {
Ok(ty) => { Ok(ty) => {
let ident = Ident::new(kw::Empty, this.prev_token.span); let ident = Ident::new(kw::Empty, this.prev_token.span);
@ -2977,6 +2994,7 @@ impl<'a> Parser<'a> {
} }
// If this is a C-variadic argument and we hit an error, return the error. // If this is a C-variadic argument and we hit an error, return the error.
Err(err) if this.token == token::DotDotDot => return Err(err), Err(err) if this.token == token::DotDotDot => return Err(err),
Err(err) if this.unmatched_angle_bracket_count > 0 => return Err(err),
// Recover from attempting to parse the argument as a type without pattern. // Recover from attempting to parse the argument as a type without pattern.
Err(err) => { Err(err) => {
err.cancel(); err.cancel();

View file

@ -0,0 +1,8 @@
// Regression test for the parser wrongfully suggesting turbofish syntax in below syntax errors
type One = for<'a> fn(Box<dyn Send + 'a);
//~^ ERROR: expected one of `+`, `,`, or `>`, found `)`
type Two = for<'a> fn(Box<dyn Send + 'a>>);
//~^ ERROR: unmatched angle bracket
fn main() {}

View file

@ -0,0 +1,25 @@
error: expected one of `+`, `,`, or `>`, found `)`
--> $DIR/bad-turbofish-hints-issue-121901.rs:3:40
|
LL | type One = for<'a> fn(Box<dyn Send + 'a);
| ^ expected one of `+`, `,`, or `>`
|
help: you might have meant to end the type parameters here
|
LL | type One = for<'a> fn(Box<dyn Send + 'a>);
| +
error: unmatched angle bracket
--> $DIR/bad-turbofish-hints-issue-121901.rs:5:41
|
LL | type Two = for<'a> fn(Box<dyn Send + 'a>>);
| ^
|
help: remove extra angle bracket
|
LL - type Two = for<'a> fn(Box<dyn Send + 'a>>);
LL + type Two = for<'a> fn(Box<dyn Send + 'a>);
|
error: aborting due to 2 previous errors