@@ -39,36 +39,6 @@ use rustc_span::{BytePos, ErrorGuaranteed, Pos, Span};
39
39
use thin_vec:: { thin_vec, ThinVec } ;
40
40
use tracing:: instrument;
41
41
42
- /// Possibly accepts an `token::Interpolated` expression (a pre-parsed expression
43
- /// dropped into the token stream, which happens while parsing the result of
44
- /// macro expansion). Placement of these is not as complex as I feared it would
45
- /// be. The important thing is to make sure that lookahead doesn't balk at
46
- /// `token::Interpolated` tokens.
47
- macro_rules! maybe_whole_expr {
48
- ( $p: expr) => {
49
- if let token:: Interpolated ( nt) = & $p. token. kind {
50
- match & * * nt {
51
- token:: NtExpr ( e) | token:: NtLiteral ( e) => {
52
- let e = e. clone( ) ;
53
- $p. bump( ) ;
54
- return Ok ( e) ;
55
- }
56
- token:: NtPath ( path) => {
57
- let path = ( * * path) . clone( ) ;
58
- $p. bump( ) ;
59
- return Ok ( $p. mk_expr( $p. prev_token. span, ExprKind :: Path ( None , path) ) ) ;
60
- }
61
- token:: NtBlock ( block) => {
62
- let block = block. clone( ) ;
63
- $p. bump( ) ;
64
- return Ok ( $p. mk_expr( $p. prev_token. span, ExprKind :: Block ( block, None ) ) ) ;
65
- }
66
- _ => { }
67
- } ;
68
- }
69
- } ;
70
- }
71
-
72
42
#[ derive( Debug ) ]
73
43
pub ( super ) enum LhsExpr {
74
44
// Already parsed just the outer attributes.
@@ -1421,7 +1391,27 @@ impl<'a> Parser<'a> {
1421
1391
/// correctly if called from `parse_dot_or_call_expr()`.
1422
1392
fn parse_expr_bottom ( & mut self ) -> PResult < ' a , P < Expr > > {
1423
1393
maybe_recover_from_interpolated_ty_qpath ! ( self , true ) ;
1424
- maybe_whole_expr ! ( self ) ;
1394
+
1395
+ if let token:: Interpolated ( nt) = & self . token . kind {
1396
+ match & * * nt {
1397
+ token:: NtExpr ( e) | token:: NtLiteral ( e) => {
1398
+ let e = e. clone ( ) ;
1399
+ self . bump ( ) ;
1400
+ return Ok ( e) ;
1401
+ }
1402
+ token:: NtPath ( path) => {
1403
+ let path = ( * * path) . clone ( ) ;
1404
+ self . bump ( ) ;
1405
+ return Ok ( self . mk_expr ( self . prev_token . span , ExprKind :: Path ( None , path) ) ) ;
1406
+ }
1407
+ token:: NtBlock ( block) => {
1408
+ let block = block. clone ( ) ;
1409
+ self . bump ( ) ;
1410
+ return Ok ( self . mk_expr ( self . prev_token . span , ExprKind :: Block ( block, None ) ) ) ;
1411
+ }
1412
+ _ => { }
1413
+ } ;
1414
+ }
1425
1415
1426
1416
// Outer attributes are already parsed and will be
1427
1417
// added to the return value after the fact.
@@ -2190,7 +2180,26 @@ impl<'a> Parser<'a> {
2190
2180
/// Matches `'-' lit | lit` (cf. `ast_validation::AstValidator::check_expr_within_pat`).
2191
2181
/// Keep this in sync with `Token::can_begin_literal_maybe_minus`.
2192
2182
pub fn parse_literal_maybe_minus ( & mut self ) -> PResult < ' a , P < Expr > > {
2193
- maybe_whole_expr ! ( self ) ;
2183
+ if let token:: Interpolated ( nt) = & self . token . kind {
2184
+ match & * * nt {
2185
+ // FIXME(nnethercote) The `NtExpr` case should only match if
2186
+ // `e` is an `ExprKind::Lit` or an `ExprKind::Unary` containing
2187
+ // an `UnOp::Neg` and an `ExprKind::Lit`, like how
2188
+ // `can_begin_literal_maybe_minus` works. But this method has
2189
+ // been over-accepting for a long time, and to make that change
2190
+ // here requires also changing some `parse_literal_maybe_minus`
2191
+ // call sites to accept additional expression kinds. E.g.
2192
+ // `ExprKind::Path` must be accepted when parsing range
2193
+ // patterns. That requires some care. So for now, we continue
2194
+ // being less strict here than we should be.
2195
+ token:: NtExpr ( e) | token:: NtLiteral ( e) => {
2196
+ let e = e. clone ( ) ;
2197
+ self . bump ( ) ;
2198
+ return Ok ( e) ;
2199
+ }
2200
+ _ => { }
2201
+ } ;
2202
+ }
2194
2203
2195
2204
let lo = self . token . span ;
2196
2205
let minus_present = self . eat ( & token:: BinOp ( token:: Minus ) ) ;
0 commit comments