1
Fork 0

Handle a negated literal in eat_token_lit.

Fixes #139495.
This commit is contained in:
Nicholas Nethercote 2025-04-11 10:45:14 +10:00
parent d4f880f8ce
commit d25c8a8ade
3 changed files with 29 additions and 4 deletions

View file

@ -2166,10 +2166,15 @@ impl<'a> Parser<'a> {
let expr = self
.eat_metavar_seq(mv_kind, |this| this.parse_expr())
.expect("metavar seq expr");
let ast::ExprKind::Lit(token_lit) = expr.kind else {
panic!("didn't reparse an expr");
};
if let ast::ExprKind::Lit(token_lit) = expr.kind {
Some(token_lit)
} else if let ast::ExprKind::Unary(UnOp::Neg, inner) = &expr.kind
&& let ast::Expr { kind: ast::ExprKind::Lit(_), .. } = **inner
{
None
} else {
panic!("unexpected reparsed expr: {:?}", expr.kind);
}
}
_ => None,
}

View file

@ -0,0 +1,7 @@
macro_rules! m {
($abi : expr) => { extern $abi } //~ ERROR expected expression, found keyword `extern`
}
fn main() {
m!(-2)
}

View file

@ -0,0 +1,13 @@
error: expected expression, found keyword `extern`
--> $DIR/reparse-expr-issue-139495.rs:2:22
|
LL | ($abi : expr) => { extern $abi }
| ^^^^^^ expected expression
...
LL | m!(-2)
| ------ in this macro invocation
|
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 1 previous error