@@ -867,35 +867,13 @@ impl<'a> Parser<'a> {
867867 return self . parse_if_expr ( attrs) ;
868868 }
869869 if self . eat_keyword ( kw:: For ) {
870- let lo = self . prev_span ;
871- return self . parse_for_expr ( None , lo, attrs) ;
870+ return self . parse_for_expr ( None , self . prev_span , attrs) ;
872871 }
873872 if self . eat_keyword ( kw:: While ) {
874- let lo = self . prev_span ;
875- return self . parse_while_expr ( None , lo, attrs) ;
873+ return self . parse_while_expr ( None , self . prev_span , attrs) ;
876874 }
877875 if let Some ( label) = self . eat_label ( ) {
878- let lo = label. ident . span ;
879- self . expect ( & token:: Colon ) ?;
880- if self . eat_keyword ( kw:: While ) {
881- return self . parse_while_expr ( Some ( label) , lo, attrs)
882- }
883- if self . eat_keyword ( kw:: For ) {
884- return self . parse_for_expr ( Some ( label) , lo, attrs)
885- }
886- if self . eat_keyword ( kw:: Loop ) {
887- return self . parse_loop_expr ( Some ( label) , lo, attrs)
888- }
889- if self . token == token:: OpenDelim ( token:: Brace ) {
890- return self . parse_block_expr ( Some ( label) ,
891- lo,
892- BlockCheckMode :: Default ,
893- attrs) ;
894- }
895- let msg = "expected `while`, `for`, `loop` or `{` after a label" ;
896- let mut err = self . fatal ( msg) ;
897- err. span_label ( self . token . span , msg) ;
898- return Err ( err) ;
876+ return self . parse_labeled_expr ( label, attrs) ;
899877 }
900878 if self . eat_keyword ( kw:: Loop ) {
901879 let lo = self . prev_span ;
@@ -1097,6 +1075,32 @@ impl<'a> Parser<'a> {
10971075 self . maybe_recover_from_bad_qpath ( expr, true )
10981076 }
10991077
1078+ fn parse_labeled_expr (
1079+ & mut self ,
1080+ label : Label ,
1081+ attrs : ThinVec < Attribute > ,
1082+ ) -> PResult < ' a , P < Expr > > {
1083+ let lo = label. ident . span ;
1084+ self . expect ( & token:: Colon ) ?;
1085+ if self . eat_keyword ( kw:: While ) {
1086+ return self . parse_while_expr ( Some ( label) , lo, attrs)
1087+ }
1088+ if self . eat_keyword ( kw:: For ) {
1089+ return self . parse_for_expr ( Some ( label) , lo, attrs)
1090+ }
1091+ if self . eat_keyword ( kw:: Loop ) {
1092+ return self . parse_loop_expr ( Some ( label) , lo, attrs)
1093+ }
1094+ if self . token == token:: OpenDelim ( token:: Brace ) {
1095+ return self . parse_block_expr ( Some ( label) , lo, BlockCheckMode :: Default , attrs) ;
1096+ }
1097+
1098+ let msg = "expected `while`, `for`, `loop` or `{` after a label" ;
1099+ let mut err = self . fatal ( msg) ;
1100+ err. span_label ( self . token . span , msg) ;
1101+ return Err ( err) ;
1102+ }
1103+
11001104 /// Returns a string literal if the next token is a string literal.
11011105 /// In case of error returns `Some(lit)` if the next token is a literal with a wrong kind,
11021106 /// and returns `None` if the next token is not literal at all.
0 commit comments