@@ -39,36 +39,6 @@ use rustc_span::{BytePos, ErrorGuaranteed, Pos, Span};
3939use  thin_vec:: { thin_vec,  ThinVec } ; 
4040use  tracing:: instrument; 
4141
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- 
7242#[ derive( Debug ) ]  
7343pub ( super )  enum  LhsExpr  { 
7444    // Already parsed just the outer attributes. 
@@ -1421,7 +1391,27 @@ impl<'a> Parser<'a> {
14211391     /// correctly if called from `parse_dot_or_call_expr()`. 
14221392     fn  parse_expr_bottom ( & mut  self )  -> PResult < ' a ,  P < Expr > >  { 
14231393        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+         } 
14251415
14261416        // Outer attributes are already parsed and will be 
14271417        // added to the return value after the fact. 
@@ -2190,7 +2180,26 @@ impl<'a> Parser<'a> {
21902180    /// Matches `'-' lit | lit` (cf. `ast_validation::AstValidator::check_expr_within_pat`). 
21912181     /// Keep this in sync with `Token::can_begin_literal_maybe_minus`. 
21922182     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+         } 
21942203
21952204        let  lo = self . token . span ; 
21962205        let  minus_present = self . eat ( & token:: BinOp ( token:: Minus ) ) ; 
0 commit comments