mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
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:
commit
278bc67fdc
@ -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();
|
||||
|
8
tests/ui/fn/bad-turbofish-hints-issue-121901.rs
Normal file
8
tests/ui/fn/bad-turbofish-hints-issue-121901.rs
Normal 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() {}
|
25
tests/ui/fn/bad-turbofish-hints-issue-121901.stderr
Normal file
25
tests/ui/fn/bad-turbofish-hints-issue-121901.stderr
Normal 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
|
||||
|
Loading…
Reference in New Issue
Block a user