@@ -1385,7 +1385,9 @@ impl<'a> Parser<'a> {
1385
1385
}
1386
1386
1387
1387
fn parse_enum_variant ( & mut self ) -> PResult < ' a , Option < Variant > > {
1388
+ self . recover_diff_marker ( ) ;
1388
1389
let variant_attrs = self . parse_outer_attributes ( ) ?;
1390
+ self . recover_diff_marker ( ) ;
1389
1391
self . collect_tokens_trailing_token (
1390
1392
variant_attrs,
1391
1393
ForceCollect :: No ,
@@ -1579,9 +1581,32 @@ impl<'a> Parser<'a> {
1579
1581
self . parse_paren_comma_seq ( |p| {
1580
1582
let attrs = p. parse_outer_attributes ( ) ?;
1581
1583
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
+ }
1582
1591
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
+ } ;
1585
1610
1586
1611
Ok ( (
1587
1612
FieldDef {
@@ -1602,7 +1627,9 @@ impl<'a> Parser<'a> {
1602
1627
1603
1628
/// Parses an element of a struct declaration.
1604
1629
fn parse_field_def ( & mut self , adt_ty : & str ) -> PResult < ' a , FieldDef > {
1630
+ self . recover_diff_marker ( ) ;
1605
1631
let attrs = self . parse_outer_attributes ( ) ?;
1632
+ self . recover_diff_marker ( ) ;
1606
1633
self . collect_tokens_trailing_token ( attrs, ForceCollect :: No , |this, attrs| {
1607
1634
let lo = this. token . span ;
1608
1635
let vis = this. parse_visibility ( FollowedByType :: No ) ?;
0 commit comments