@@ -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