@@ -83,7 +83,7 @@ macro_rules! maybe_whole_expr {
8383pub ( super ) enum LhsExpr {
8484 NotYetParsed ,
8585 AttributesParsed ( AttrWrapper ) ,
86- AlreadyParsed ( P < Expr > ) ,
86+ AlreadyParsed ( P < Expr > , bool ) , // (expr, starts_statement)
8787}
8888
8989impl From < Option < AttrWrapper > > for LhsExpr {
@@ -101,7 +101,7 @@ impl From<P<Expr>> for LhsExpr {
101101 ///
102102 /// This conversion does not allocate.
103103 fn from ( expr : P < Expr > ) -> Self {
104- LhsExpr :: AlreadyParsed ( expr)
104+ LhsExpr :: AlreadyParsed ( expr, false )
105105 }
106106}
107107
@@ -173,7 +173,9 @@ impl<'a> Parser<'a> {
173173 min_prec : usize ,
174174 lhs : LhsExpr ,
175175 ) -> PResult < ' a , P < Expr > > {
176- let mut lhs = if let LhsExpr :: AlreadyParsed ( expr) = lhs {
176+ let mut starts_stmt = false ;
177+ let mut lhs = if let LhsExpr :: AlreadyParsed ( expr, starts_statement) = lhs {
178+ starts_stmt = starts_statement;
177179 expr
178180 } else {
179181 let attrs = match lhs {
@@ -292,15 +294,7 @@ impl<'a> Parser<'a> {
292294 let op_span = self . prev_token . span . to ( self . token . span ) ;
293295 // Eat the second `+`
294296 self . bump ( ) ;
295- let prev_is_semi = {
296- if let Ok ( prev_code) = self . sess . source_map ( ) . span_to_prev_source ( lhs. span ) &&
297- prev_code. trim_end ( ) . ends_with ( ";" ) {
298- true
299- } else {
300- false
301- }
302- } ;
303- lhs = self . recover_from_postfix_increment ( lhs, op_span, prev_is_semi) ?;
297+ lhs = self . recover_from_postfix_increment ( lhs, op_span, starts_stmt) ?;
304298 continue ;
305299 }
306300
@@ -607,14 +601,15 @@ impl<'a> Parser<'a> {
607601 token:: BinOp ( token:: Plus )
608602 if this. look_ahead ( 1 , |t| * t == token:: BinOp ( token:: Plus ) ) =>
609603 {
610- let prev_is_semi = this. prev_token == token:: Semi ;
604+ let starts_stmt = this. prev_token == token:: Semi
605+ || this. prev_token == token:: CloseDelim ( Delimiter :: Brace ) ;
611606 let pre_span = this. token . span . to ( this. look_ahead ( 1 , |t| t. span ) ) ;
612607 // Eat both `+`s.
613608 this. bump ( ) ;
614609 this. bump ( ) ;
615610
616611 let operand_expr = this. parse_dot_or_call_expr ( Default :: default ( ) ) ?;
617- this. recover_from_prefix_increment ( operand_expr, pre_span, prev_is_semi )
612+ this. recover_from_prefix_increment ( operand_expr, pre_span, starts_stmt )
618613 }
619614 token:: Ident ( ..) if this. token . is_keyword ( kw:: Box ) => {
620615 make_it ! ( this, attrs, |this, _| this. parse_box_expr( lo) )
0 commit comments