@@ -1385,7 +1385,9 @@ impl<'a> Parser<'a> {
13851385    } 
13861386
13871387    fn  parse_enum_variant ( & mut  self )  -> PResult < ' a ,  Option < Variant > >  { 
1388+         self . recover_diff_marker ( ) ; 
13881389        let  variant_attrs = self . parse_outer_attributes ( ) ?; 
1390+         self . recover_diff_marker ( ) ; 
13891391        self . collect_tokens_trailing_token ( 
13901392            variant_attrs, 
13911393            ForceCollect :: No , 
@@ -1579,9 +1581,32 @@ impl<'a> Parser<'a> {
15791581        self . parse_paren_comma_seq ( |p| { 
15801582            let  attrs = p. parse_outer_attributes ( ) ?; 
15811583            p. collect_tokens_trailing_token ( attrs,  ForceCollect :: No ,  |p,  attrs| { 
1584+                 let  mut  snapshot = None ; 
1585+                 if  p. is_diff_marker ( & TokenKind :: BinOp ( token:: Shl ) ,  & TokenKind :: Lt )  { 
1586+                     // Account for `<<<<<<<` diff markers. We can't proactivelly error here because 
1587+                     // that can be a valid type start, so we snapshot and reparse only we've 
1588+                     // encountered another parse error. 
1589+                     snapshot = Some ( p. create_snapshot_for_diagnostic ( ) ) ; 
1590+                 } 
15821591                let  lo = p. token . span ; 
1583-                 let  vis = p. parse_visibility ( FollowedByType :: Yes ) ?; 
1584-                 let  ty = p. parse_ty ( ) ?; 
1592+                 let  vis = match  p. parse_visibility ( FollowedByType :: Yes )  { 
1593+                     Ok ( vis)  => vis, 
1594+                     Err ( err)  => { 
1595+                         if  let  Some ( ref  mut  snapshot)  = snapshot { 
1596+                             snapshot. recover_diff_marker ( ) ; 
1597+                         } 
1598+                         return  Err ( err) ; 
1599+                     } 
1600+                 } ; 
1601+                 let  ty = match  p. parse_ty ( )  { 
1602+                     Ok ( ty)  => ty, 
1603+                     Err ( err)  => { 
1604+                         if  let  Some ( ref  mut  snapshot)  = snapshot { 
1605+                             snapshot. recover_diff_marker ( ) ; 
1606+                         } 
1607+                         return  Err ( err) ; 
1608+                     } 
1609+                 } ; 
15851610
15861611                Ok ( ( 
15871612                    FieldDef  { 
@@ -1602,7 +1627,9 @@ impl<'a> Parser<'a> {
16021627
16031628    /// Parses an element of a struct declaration. 
16041629     fn  parse_field_def ( & mut  self ,  adt_ty :  & str )  -> PResult < ' a ,  FieldDef >  { 
1630+         self . recover_diff_marker ( ) ; 
16051631        let  attrs = self . parse_outer_attributes ( ) ?; 
1632+         self . recover_diff_marker ( ) ; 
16061633        self . collect_tokens_trailing_token ( attrs,  ForceCollect :: No ,  |this,  attrs| { 
16071634            let  lo = this. token . span ; 
16081635            let  vis = this. parse_visibility ( FollowedByType :: No ) ?; 
0 commit comments