@@ -46,7 +46,7 @@ use crate::ThinVec;
4646use crate :: tokenstream:: { self , DelimSpan , TokenTree , TokenStream , TreeAndJoint } ;
4747use crate :: symbol:: { Symbol , keywords} ;
4848
49- use errors:: { Applicability , DiagnosticBuilder , DiagnosticId } ;
49+ use errors:: { Applicability , DiagnosticBuilder , DiagnosticId , FatalError } ;
5050use rustc_target:: spec:: abi:: { self , Abi } ;
5151use syntax_pos:: { Span , MultiSpan , BytePos , FileName } ;
5252use log:: { debug, trace} ;
@@ -256,6 +256,7 @@ pub struct Parser<'a> {
256256 /// it gets removed from here. Every entry left at the end gets emitted as an independent
257257 /// error.
258258 crate unclosed_delims : Vec < UnmatchedBrace > ,
259+ last_unexpected_token_span : Option < Span > ,
259260}
260261
261262
@@ -582,6 +583,7 @@ impl<'a> Parser<'a> {
582583 unmatched_angle_bracket_count : 0 ,
583584 max_angle_bracket_count : 0 ,
584585 unclosed_delims : Vec :: new ( ) ,
586+ last_unexpected_token_span : None ,
585587 } ;
586588
587589 let tok = parser. next_tok ( ) ;
@@ -775,6 +777,8 @@ impl<'a> Parser<'a> {
775777 } else if inedible. contains ( & self . token ) {
776778 // leave it in the input
777779 Ok ( false )
780+ } else if self . last_unexpected_token_span == Some ( self . span ) {
781+ FatalError . raise ( ) ;
778782 } else {
779783 let mut expected = edible. iter ( )
780784 . map ( |x| TokenType :: Token ( x. clone ( ) ) )
@@ -802,6 +806,7 @@ impl<'a> Parser<'a> {
802806 ( self . sess . source_map ( ) . next_point ( self . prev_span ) ,
803807 format ! ( "expected {} here" , expect) ) )
804808 } ;
809+ self . last_unexpected_token_span = Some ( self . span ) ;
805810 let mut err = self . fatal ( & msg_exp) ;
806811 if self . token . is_ident_named ( "and" ) {
807812 err. span_suggestion_short (
@@ -6321,10 +6326,11 @@ impl<'a> Parser<'a> {
63216326 & token:: CloseDelim ( token:: Paren ) , sep, parse_arg_fn) ?;
63226327 fn_inputs. append ( & mut input) ;
63236328 ( fn_inputs, recovered)
6324- } else if let Err ( err) = self . expect_one_of ( & [ ] , & [ ] ) {
6325- return Err ( err) ;
63266329 } else {
6327- ( vec ! [ self_arg] , true )
6330+ match self . expect_one_of ( & [ ] , & [ ] ) {
6331+ Err ( err) => return Err ( err) ,
6332+ Ok ( recovered) => ( vec ! [ self_arg] , recovered) ,
6333+ }
63286334 }
63296335 } else {
63306336 self . parse_seq_to_before_end ( & token:: CloseDelim ( token:: Paren ) , sep, parse_arg_fn) ?
0 commit comments