@@ -867,35 +867,13 @@ impl<'a> Parser<'a> {
867
867
return self . parse_if_expr ( attrs) ;
868
868
}
869
869
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) ;
872
871
}
873
872
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) ;
876
874
}
877
875
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) ;
899
877
}
900
878
if self . eat_keyword ( kw:: Loop ) {
901
879
let lo = self . prev_span ;
@@ -1097,6 +1075,32 @@ impl<'a> Parser<'a> {
1097
1075
self . maybe_recover_from_bad_qpath ( expr, true )
1098
1076
}
1099
1077
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
+
1100
1104
/// Returns a string literal if the next token is a string literal.
1101
1105
/// In case of error returns `Some(lit)` if the next token is a literal with a wrong kind,
1102
1106
/// and returns `None` if the next token is not literal at all.
0 commit comments