Rollup merge of #139392 - compiler-errors:raw-expr, r=oli-obk
Detect and provide suggestion for `&raw EXPR` When emitting an error in the parser, and we detect that the previous token was `raw` and we *could* have consumed `const`/`mut`, suggest that this may have been a mistyped raw ref expr. To do this, we add `const`/`mut` to the expected token set when parsing `&raw` as an expression (which does not affect the "good path" of parsing, for the record). This is kind of a rudimentary error improvement, since it doesn't actually attempt to recover anything, leading to some other knock-on errors b/c we still treat `&raw` as the expression that was parsed... but at least we add the suggestion! I don't think the parser grammar means we can faithfully recover `&raw EXPR` early, i.e. during `parse_expr_borrow`. Fixes #133231
This commit is contained in:
@@ -827,6 +827,18 @@ impl<'a> Parser<'a> {
|
||||
if let Some(lt) = lifetime {
|
||||
self.error_remove_borrow_lifetime(span, lt.ident.span.until(expr.span));
|
||||
}
|
||||
|
||||
// Add expected tokens if we parsed `&raw` as an expression.
|
||||
// This will make sure we see "expected `const`, `mut`", and
|
||||
// guides recovery in case we write `&raw expr`.
|
||||
if borrow_kind == ast::BorrowKind::Ref
|
||||
&& mutbl == ast::Mutability::Not
|
||||
&& matches!(&expr.kind, ExprKind::Path(None, p) if p.is_ident(kw::Raw))
|
||||
{
|
||||
self.expected_token_types.insert(TokenType::KwMut);
|
||||
self.expected_token_types.insert(TokenType::KwConst);
|
||||
}
|
||||
|
||||
Ok((span, ExprKind::AddrOf(borrow_kind, mutbl, expr)))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user