@@ -22,8 +22,8 @@ use crate::{
2222} ;
2323
2424use super :: {
25- BindingMode , BreakableContext , Diverges , Expectation , InferenceContext , InferenceDiagnostic ,
26- TypeMismatch ,
25+ find_breakable , BindingMode , BreakableContext , Diverges , Expectation , InferenceContext ,
26+ InferenceDiagnostic , TypeMismatch ,
2727} ;
2828
2929impl < ' a > InferenceContext < ' a > {
@@ -86,16 +86,20 @@ impl<'a> InferenceContext<'a> {
8686
8787 self . coerce_merge_branch ( & then_ty, & else_ty)
8888 }
89- Expr :: Block { statements, tail } => self . infer_block ( statements, * tail, expected) ,
89+ Expr :: Block { statements, tail, .. } => {
90+ // FIXME: Breakable block inference
91+ self . infer_block ( statements, * tail, expected)
92+ }
9093 Expr :: TryBlock { body } => {
9194 let _inner = self . infer_expr ( * body, expected) ;
9295 // FIXME should be std::result::Result<{inner}, _>
9396 Ty :: Unknown
9497 }
95- Expr :: Loop { body } => {
98+ Expr :: Loop { body, label } => {
9699 self . breakables . push ( BreakableContext {
97100 may_break : false ,
98101 break_ty : self . table . new_type_var ( ) ,
102+ label : label. clone ( ) ,
99103 } ) ;
100104 self . infer_expr ( * body, & Expectation :: has_type ( Ty :: unit ( ) ) ) ;
101105
@@ -110,8 +114,12 @@ impl<'a> InferenceContext<'a> {
110114 Ty :: simple ( TypeCtor :: Never )
111115 }
112116 }
113- Expr :: While { condition, body } => {
114- self . breakables . push ( BreakableContext { may_break : false , break_ty : Ty :: Unknown } ) ;
117+ Expr :: While { condition, body, label } => {
118+ self . breakables . push ( BreakableContext {
119+ may_break : false ,
120+ break_ty : Ty :: Unknown ,
121+ label : label. clone ( ) ,
122+ } ) ;
115123 // while let is desugared to a match loop, so this is always simple while
116124 self . infer_expr ( * condition, & Expectation :: has_type ( Ty :: simple ( TypeCtor :: Bool ) ) ) ;
117125 self . infer_expr ( * body, & Expectation :: has_type ( Ty :: unit ( ) ) ) ;
@@ -120,10 +128,14 @@ impl<'a> InferenceContext<'a> {
120128 self . diverges = Diverges :: Maybe ;
121129 Ty :: unit ( )
122130 }
123- Expr :: For { iterable, body, pat } => {
131+ Expr :: For { iterable, body, pat, label } => {
124132 let iterable_ty = self . infer_expr ( * iterable, & Expectation :: none ( ) ) ;
125133
126- self . breakables . push ( BreakableContext { may_break : false , break_ty : Ty :: Unknown } ) ;
134+ self . breakables . push ( BreakableContext {
135+ may_break : false ,
136+ break_ty : Ty :: Unknown ,
137+ label : label. clone ( ) ,
138+ } ) ;
127139 let pat_ty =
128140 self . resolve_associated_type ( iterable_ty, self . resolve_into_iter_item ( ) ) ;
129141
@@ -236,23 +248,24 @@ impl<'a> InferenceContext<'a> {
236248 let resolver = resolver_for_expr ( self . db . upcast ( ) , self . owner , tgt_expr) ;
237249 self . infer_path ( & resolver, p, tgt_expr. into ( ) ) . unwrap_or ( Ty :: Unknown )
238250 }
239- Expr :: Continue => Ty :: simple ( TypeCtor :: Never ) ,
240- Expr :: Break { expr } => {
251+ Expr :: Continue { .. } => Ty :: simple ( TypeCtor :: Never ) ,
252+ Expr :: Break { expr, label } => {
241253 let val_ty = if let Some ( expr) = expr {
242254 self . infer_expr ( * expr, & Expectation :: none ( ) )
243255 } else {
244256 Ty :: unit ( )
245257 } ;
246258
247- let last_ty = if let Some ( ctxt) = self . breakables . last ( ) {
248- ctxt. break_ty . clone ( )
249- } else {
250- Ty :: Unknown
251- } ;
259+ let last_ty =
260+ if let Some ( ctxt) = find_breakable ( & mut self . breakables , label. as_ref ( ) ) {
261+ ctxt. break_ty . clone ( )
262+ } else {
263+ Ty :: Unknown
264+ } ;
252265
253266 let merged_type = self . coerce_merge_branch ( & last_ty, & val_ty) ;
254267
255- if let Some ( ctxt) = self . breakables . last_mut ( ) {
268+ if let Some ( ctxt) = find_breakable ( & mut self . breakables , label . as_ref ( ) ) {
256269 ctxt. break_ty = merged_type;
257270 ctxt. may_break = true ;
258271 } else {
0 commit comments