Rollup merge of #139264 - freyacodes:fix/bad-turbofish-hints, r=petrochenkov

Fix two incorrect turbofish suggestions

This fixes #121901

This is my contribution to Rust, and my first contribution to a language parser that I didn't write myself.
I am a bit outside my depth here, so any constructive criticism is appreciated.
This commit is contained in:
Matthias Krüger 2025-04-02 19:44:15 +02:00 committed by GitHub
commit 278bc67fdc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 58 additions and 7 deletions

View File

@ -2960,13 +2960,30 @@ impl<'a> Parser<'a> {
let parser_snapshot_before_ty = this.create_snapshot_for_diagnostic();
this.eat_incorrect_doc_comment_for_param_type();
let mut ty = this.parse_ty_for_param();
if ty.is_ok()
&& this.token != token::Comma
&& this.token != token::CloseDelim(Delimiter::Parenthesis)
{
// This wasn't actually a type, but a pattern looking like a type,
// so we are going to rollback and re-parse for recovery.
ty = this.unexpected_any();
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 wasn't actually a type, but a pattern looking like a type,
// so we are going to rollback and re-parse for recovery.
ty = this.unexpected_any();
}
}
match ty {
Ok(ty) => {
@ -2977,6 +2994,7 @@ impl<'a> Parser<'a> {
}
// 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.unmatched_angle_bracket_count > 0 => return Err(err),
// Recover from attempting to parse the argument as a type without pattern.
Err(err) => {
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