1- use super :: pat:: { RecoverColon , RecoverComma , PARAM_EXPECTED } ;
1+ use super :: pat:: { CommaRecoveryMode , RecoverColon , RecoverComma , PARAM_EXPECTED } ;
22use super :: ty:: { AllowPlus , RecoverQPath , RecoverReturnSign } ;
33use super :: {
44 AttrWrapper , BlockMode , ClosureSpans , ForceCollect , Parser , PathStyle , Restrictions , TokenType ,
@@ -1286,18 +1286,27 @@ impl<'a> Parser<'a> {
12861286 } else if let Some ( label) = self . eat_label ( ) {
12871287 self . parse_labeled_expr ( label, attrs, true )
12881288 } else if self . eat_keyword ( kw:: Loop ) {
1289- self . parse_loop_expr ( None , self . prev_token . span , attrs)
1289+ let sp = self . prev_token . span ;
1290+ self . parse_loop_expr ( None , self . prev_token . span , attrs) . map_err ( |mut err| {
1291+ err. span_label ( sp, "while parsing this `loop` expression" ) ;
1292+ err
1293+ } )
12901294 } else if self . eat_keyword ( kw:: Continue ) {
12911295 let kind = ExprKind :: Continue ( self . eat_label ( ) ) ;
12921296 Ok ( self . mk_expr ( lo. to ( self . prev_token . span ) , kind, attrs) )
12931297 } else if self . eat_keyword ( kw:: Match ) {
12941298 let match_sp = self . prev_token . span ;
12951299 self . parse_match_expr ( attrs) . map_err ( |mut err| {
1296- err. span_label ( match_sp, "while parsing this match expression" ) ;
1300+ err. span_label ( match_sp, "while parsing this ` match` expression" ) ;
12971301 err
12981302 } )
12991303 } else if self . eat_keyword ( kw:: Unsafe ) {
1304+ let sp = self . prev_token . span ;
13001305 self . parse_block_expr ( None , lo, BlockCheckMode :: Unsafe ( ast:: UserProvided ) , attrs)
1306+ . map_err ( |mut err| {
1307+ err. span_label ( sp, "while parsing this `unsafe` expression" ) ;
1308+ err
1309+ } )
13011310 } else if self . check_inline_const ( 0 ) {
13021311 self . parse_const_block ( lo. to ( self . token . span ) , false )
13031312 } else if self . is_do_catch_block ( ) {
@@ -2160,7 +2169,12 @@ impl<'a> Parser<'a> {
21602169 /// The `let` token has already been eaten.
21612170 fn parse_let_expr ( & mut self , attrs : AttrVec ) -> PResult < ' a , P < Expr > > {
21622171 let lo = self . prev_token . span ;
2163- let pat = self . parse_pat_allow_top_alt ( None , RecoverComma :: Yes , RecoverColon :: Yes ) ?;
2172+ let pat = self . parse_pat_allow_top_alt (
2173+ None ,
2174+ RecoverComma :: Yes ,
2175+ RecoverColon :: Yes ,
2176+ CommaRecoveryMode :: LikelyTuple ,
2177+ ) ?;
21642178 self . expect ( & token:: Eq ) ?;
21652179 let expr = self . with_res ( self . restrictions | Restrictions :: NO_STRUCT_LITERAL , |this| {
21662180 this. parse_assoc_expr_with ( 1 + prec_let_scrutinee_needs_par ( ) , None . into ( ) )
@@ -2223,7 +2237,12 @@ impl<'a> Parser<'a> {
22232237 _ => None ,
22242238 } ;
22252239
2226- let pat = self . parse_pat_allow_top_alt ( None , RecoverComma :: Yes , RecoverColon :: Yes ) ?;
2240+ let pat = self . parse_pat_allow_top_alt (
2241+ None ,
2242+ RecoverComma :: Yes ,
2243+ RecoverColon :: Yes ,
2244+ CommaRecoveryMode :: LikelyTuple ,
2245+ ) ?;
22272246 if !self . eat_keyword ( kw:: In ) {
22282247 self . error_missing_in_for_loop ( ) ;
22292248 }
@@ -2266,8 +2285,15 @@ impl<'a> Parser<'a> {
22662285 lo : Span ,
22672286 mut attrs : AttrVec ,
22682287 ) -> PResult < ' a , P < Expr > > {
2269- let cond = self . parse_cond_expr ( ) ?;
2270- let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) ?;
2288+ let cond = self . parse_cond_expr ( ) . map_err ( |mut err| {
2289+ err. span_label ( lo, "while parsing the condition of this `while` expression" ) ;
2290+ err
2291+ } ) ?;
2292+ let ( iattrs, body) = self . parse_inner_attrs_and_block ( ) . map_err ( |mut err| {
2293+ err. span_label ( lo, "while parsing the body of this `while` expression" ) ;
2294+ err. span_label ( cond. span , "this `while` condition successfully parsed" ) ;
2295+ err
2296+ } ) ?;
22712297 attrs. extend ( iattrs) ;
22722298 Ok ( self . mk_expr ( lo. to ( self . prev_token . span ) , ExprKind :: While ( cond, body, opt_label) , attrs) )
22732299 }
@@ -2284,7 +2310,7 @@ impl<'a> Parser<'a> {
22842310 Ok ( self . mk_expr ( lo. to ( self . prev_token . span ) , ExprKind :: Loop ( body, opt_label) , attrs) )
22852311 }
22862312
2287- fn eat_label ( & mut self ) -> Option < Label > {
2313+ crate fn eat_label ( & mut self ) -> Option < Label > {
22882314 self . token . lifetime ( ) . map ( |ident| {
22892315 self . bump ( ) ;
22902316 Label { ident }
@@ -2305,7 +2331,12 @@ impl<'a> Parser<'a> {
23052331 Applicability :: MaybeIncorrect , // speculative
23062332 ) ;
23072333 }
2308- return Err ( e) ;
2334+ if self . maybe_recover_unexpected_block_label ( ) {
2335+ e. cancel ( ) ;
2336+ self . bump ( ) ;
2337+ } else {
2338+ return Err ( e) ;
2339+ }
23092340 }
23102341 attrs. extend ( self . parse_inner_attributes ( ) ?) ;
23112342
@@ -2441,7 +2472,12 @@ impl<'a> Parser<'a> {
24412472 let attrs = self . parse_outer_attributes ( ) ?;
24422473 self . collect_tokens_trailing_token ( attrs, ForceCollect :: No , |this, attrs| {
24432474 let lo = this. token . span ;
2444- let pat = this. parse_pat_allow_top_alt ( None , RecoverComma :: Yes , RecoverColon :: Yes ) ?;
2475+ let pat = this. parse_pat_allow_top_alt (
2476+ None ,
2477+ RecoverComma :: Yes ,
2478+ RecoverColon :: Yes ,
2479+ CommaRecoveryMode :: EitherTupleOrPipe ,
2480+ ) ?;
24452481 let guard = if this. eat_keyword ( kw:: If ) {
24462482 let if_span = this. prev_token . span ;
24472483 let cond = this. parse_expr ( ) ?;
0 commit comments