@@ -31,7 +31,8 @@ use rustc_ast::{
3131use rustc_ast_pretty:: pprust;
3232use rustc_data_structures:: fx:: FxHashSet ;
3333use rustc_errors:: {
34- fluent, Applicability , DiagnosticBuilder , DiagnosticMessage , Handler , MultiSpan , PResult ,
34+ fluent, Applicability , DiagnosticBuilder , DiagnosticMessage , FatalError , Handler , MultiSpan ,
35+ PResult ,
3536} ;
3637use rustc_errors:: { pluralize, Diagnostic , ErrorGuaranteed , IntoDiagnostic } ;
3738use rustc_session:: errors:: ExprParenthesesNeeded ;
@@ -2556,6 +2557,57 @@ impl<'a> Parser<'a> {
25562557 Ok ( ( ) )
25572558 }
25582559
2560+ pub fn is_diff_marker ( & mut self , long_kind : & TokenKind , short_kind : & TokenKind ) -> bool {
2561+ ( 0 ..3 ) . all ( |i| self . look_ahead ( i, |tok| tok == long_kind) )
2562+ && self . look_ahead ( 3 , |tok| tok == short_kind)
2563+ }
2564+
2565+ fn diff_marker ( & mut self , long_kind : & TokenKind , short_kind : & TokenKind ) -> Option < Span > {
2566+ if self . is_diff_marker ( long_kind, short_kind) {
2567+ let lo = self . token . span ;
2568+ for _ in 0 ..4 {
2569+ self . bump ( ) ;
2570+ }
2571+ return Some ( lo. to ( self . prev_token . span ) ) ;
2572+ }
2573+ None
2574+ }
2575+
2576+ pub fn recover_diff_marker ( & mut self ) {
2577+ let Some ( start) = self . diff_marker ( & TokenKind :: BinOp ( token:: Shl ) , & TokenKind :: Lt ) else {
2578+ return ;
2579+ } ;
2580+ let mut spans = Vec :: with_capacity ( 3 ) ;
2581+ spans. push ( start) ;
2582+ let mut middle = None ;
2583+ let mut end = None ;
2584+ loop {
2585+ if self . token . kind == TokenKind :: Eof {
2586+ break ;
2587+ }
2588+ if let Some ( span) = self . diff_marker ( & TokenKind :: EqEq , & TokenKind :: Eq ) {
2589+ spans. push ( span) ;
2590+ middle = Some ( span) ;
2591+ }
2592+ if let Some ( span) = self . diff_marker ( & TokenKind :: BinOp ( token:: Shr ) , & TokenKind :: Gt ) {
2593+ spans. push ( span) ;
2594+ end = Some ( span) ;
2595+ break ;
2596+ }
2597+ self . bump ( ) ;
2598+ }
2599+ let mut err = self . struct_span_err ( spans, "encountered diff marker" ) ;
2600+ err. span_label ( start, "start" ) ;
2601+ if let Some ( middle) = middle {
2602+ err. span_label ( middle, "middle" ) ;
2603+ }
2604+ if let Some ( end) = end {
2605+ err. span_label ( end, "end" ) ;
2606+ }
2607+ err. emit ( ) ;
2608+ FatalError . raise ( )
2609+ }
2610+
25592611 /// Parse and throw away a parenthesized comma separated
25602612 /// sequence of patterns until `)` is reached.
25612613 fn skip_pat_list ( & mut self ) -> PResult < ' a , ( ) > {
0 commit comments