Recover from X<Y,Z> when parsing const expr
This adds recovery when in array type syntax user writes [X; Y<Z, ...>] instead of [X; Y::<Z, ...>] Fixes #82566 Note that whenever we parse an expression and know that the next token cannot be `,`, we should be calling check_mistyped_turbofish_with_multiple_type_params for this recovery. Previously we only did this for statement parsing (e.g. `let x = f<a, b>;`). We now also do it when parsing the length field in array type syntax.
This commit is contained in:
parent
fb631a55c2
commit
992b914b6b
5 changed files with 79 additions and 5 deletions
|
@ -360,12 +360,20 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
Err(err) => return Err(err),
|
||||
};
|
||||
|
||||
let ty = if self.eat(&token::Semi) {
|
||||
TyKind::Array(elt_ty, self.parse_anon_const_expr()?)
|
||||
let mut length = self.parse_anon_const_expr()?;
|
||||
if let Err(e) = self.expect(&token::CloseDelim(token::Bracket)) {
|
||||
// Try to recover from `X<Y, ...>` when `X::<Y, ...>` works
|
||||
self.check_mistyped_turbofish_with_multiple_type_params(e, &mut length.value)?;
|
||||
self.expect(&token::CloseDelim(token::Bracket))?;
|
||||
}
|
||||
TyKind::Array(elt_ty, length)
|
||||
} else {
|
||||
self.expect(&token::CloseDelim(token::Bracket))?;
|
||||
TyKind::Slice(elt_ty)
|
||||
};
|
||||
self.expect(&token::CloseDelim(token::Bracket))?;
|
||||
|
||||
Ok(ty)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue