@@ -87,16 +87,15 @@ impl<'a> InferenceContext<'a> {
8787 let expected = & expected. adjust_for_branches ( & mut self . table ) ;
8888 self . infer_expr (
8989 condition,
90- & Expectation :: has_type ( TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ) ,
90+ & Expectation :: HasType ( self . result . standard_types . bool_ . clone ( ) ) ,
9191 ) ;
9292
9393 let condition_diverges = mem:: replace ( & mut self . diverges , Diverges :: Maybe ) ;
9494 let mut both_arms_diverge = Diverges :: Always ;
9595
96- let result_ty = self . table . new_type_var ( ) ;
9796 let then_ty = self . infer_expr_inner ( then_branch, expected) ;
9897 both_arms_diverge &= mem:: replace ( & mut self . diverges , Diverges :: Maybe ) ;
99- let mut coerce = CoerceMany :: new ( result_ty ) ;
98+ let mut coerce = CoerceMany :: new ( expected . coercion_target_type ( & mut self . table ) ) ;
10099 coerce. coerce ( self , Some ( then_branch) , & then_ty) ;
101100 let else_ty = match else_branch {
102101 Some ( else_branch) => self . infer_expr_inner ( else_branch, expected) ,
@@ -113,7 +112,7 @@ impl<'a> InferenceContext<'a> {
113112 & Expr :: Let { pat, expr } => {
114113 let input_ty = self . infer_expr ( expr, & Expectation :: none ( ) ) ;
115114 self . infer_pat ( pat, & input_ty, BindingMode :: default ( ) ) ;
116- TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner )
115+ self . result . standard_types . bool_ . clone ( )
117116 }
118117 Expr :: Block { statements, tail, label, id : _ } => {
119118 let old_resolver = mem:: replace (
@@ -188,27 +187,29 @@ impl<'a> InferenceContext<'a> {
188187 . intern ( Interner )
189188 }
190189 & Expr :: Loop { body, label } => {
190+ // FIXME: should be:
191+ // let ty = expected.coercion_target_type(&mut self.table);
191192 let ty = self . table . new_type_var ( ) ;
192193 let ( breaks, ( ) ) =
193194 self . with_breakable_ctx ( BreakableKind :: Loop , ty, label, |this| {
194- this. infer_expr ( body, & Expectation :: has_type ( TyBuilder :: unit ( ) ) ) ;
195+ this. infer_expr ( body, & Expectation :: HasType ( TyBuilder :: unit ( ) ) ) ;
195196 } ) ;
196197
197198 match breaks {
198199 Some ( breaks) => {
199200 self . diverges = Diverges :: Maybe ;
200201 breaks
201202 }
202- None => TyKind :: Never . intern ( Interner ) ,
203+ None => self . result . standard_types . never . clone ( ) ,
203204 }
204205 }
205206 & Expr :: While { condition, body, label } => {
206207 self . with_breakable_ctx ( BreakableKind :: Loop , self . err_ty ( ) , label, |this| {
207208 this. infer_expr (
208209 condition,
209- & Expectation :: has_type ( TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ) ,
210+ & Expectation :: HasType ( this . result . standard_types . bool_ . clone ( ) ) ,
210211 ) ;
211- this. infer_expr ( body, & Expectation :: has_type ( TyBuilder :: unit ( ) ) ) ;
212+ this. infer_expr ( body, & Expectation :: HasType ( TyBuilder :: unit ( ) ) ) ;
212213 } ) ;
213214
214215 // the body may not run, so it diverging doesn't mean we diverge
@@ -224,7 +225,7 @@ impl<'a> InferenceContext<'a> {
224225
225226 self . infer_pat ( pat, & pat_ty, BindingMode :: default ( ) ) ;
226227 self . with_breakable_ctx ( BreakableKind :: Loop , self . err_ty ( ) , label, |this| {
227- this. infer_expr ( body, & Expectation :: has_type ( TyBuilder :: unit ( ) ) ) ;
228+ this. infer_expr ( body, & Expectation :: HasType ( TyBuilder :: unit ( ) ) ) ;
228229 } ) ;
229230
230231 // the body may not run, so it diverging doesn't mean we diverge
@@ -382,12 +383,9 @@ impl<'a> InferenceContext<'a> {
382383 let expected = expected. adjust_for_branches ( & mut self . table ) ;
383384
384385 let result_ty = if arms. is_empty ( ) {
385- TyKind :: Never . intern ( Interner )
386+ self . result . standard_types . never . clone ( )
386387 } else {
387- match & expected {
388- Expectation :: HasType ( ty) => ty. clone ( ) ,
389- _ => self . table . new_type_var ( ) ,
390- }
388+ expected. coercion_target_type ( & mut self . table )
391389 } ;
392390 let mut coerce = CoerceMany :: new ( result_ty) ;
393391
@@ -400,7 +398,7 @@ impl<'a> InferenceContext<'a> {
400398 if let Some ( guard_expr) = arm. guard {
401399 self . infer_expr (
402400 guard_expr,
403- & Expectation :: has_type ( TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ) ,
401+ & Expectation :: HasType ( self . result . standard_types . bool_ . clone ( ) ) ,
404402 ) ;
405403 }
406404
@@ -425,7 +423,7 @@ impl<'a> InferenceContext<'a> {
425423 is_break : false ,
426424 } ) ;
427425 } ;
428- TyKind :: Never . intern ( Interner )
426+ self . result . standard_types . never . clone ( )
429427 }
430428 Expr :: Break { expr, label } => {
431429 let val_ty = if let Some ( expr) = * expr {
@@ -439,7 +437,7 @@ impl<'a> InferenceContext<'a> {
439437 // avoiding the borrowck
440438 let mut coerce = mem:: replace (
441439 & mut ctxt. coerce ,
442- CoerceMany :: new ( self . result . standard_types . unknown . clone ( ) ) ,
440+ CoerceMany :: new ( expected . coercion_target_type ( & mut self . table ) ) ,
443441 ) ;
444442
445443 // FIXME: create a synthetic `()` during lowering so we have something to refer to here?
@@ -457,7 +455,7 @@ impl<'a> InferenceContext<'a> {
457455 } ) ;
458456 }
459457 }
460- TyKind :: Never . intern ( Interner )
458+ self . result . standard_types . never . clone ( )
461459 }
462460 Expr :: Return { expr } => {
463461 if let Some ( expr) = expr {
@@ -466,7 +464,7 @@ impl<'a> InferenceContext<'a> {
466464 let unit = TyBuilder :: unit ( ) ;
467465 let _ = self . coerce ( Some ( tgt_expr) , & unit, & self . return_ty . clone ( ) ) ;
468466 }
469- TyKind :: Never . intern ( Interner )
467+ self . result . standard_types . never . clone ( )
470468 }
471469 Expr :: Yield { expr } => {
472470 if let Some ( ( resume_ty, yield_ty) ) = self . resume_yield_tys . clone ( ) {
@@ -479,14 +477,14 @@ impl<'a> InferenceContext<'a> {
479477 resume_ty
480478 } else {
481479 // FIXME: report error (yield expr in non-generator)
482- TyKind :: Error . intern ( Interner )
480+ self . result . standard_types . unknown . clone ( )
483481 }
484482 }
485483 Expr :: Yeet { expr } => {
486484 if let & Some ( expr) = expr {
487485 self . infer_expr_inner ( expr, & Expectation :: None ) ;
488486 }
489- TyKind :: Never . intern ( Interner )
487+ self . result . standard_types . never . clone ( )
490488 }
491489 Expr :: RecordLit { path, fields, spread, .. } => {
492490 let ( ty, def_id) = self . resolve_variant ( path. as_deref ( ) , false ) ;
@@ -611,8 +609,8 @@ impl<'a> InferenceContext<'a> {
611609 }
612610 Expr :: Cast { expr, type_ref } => {
613611 let cast_ty = self . make_ty ( type_ref) ;
614- let _inner_ty =
615- self . infer_expr_inner ( * expr, & Expectation :: Castable ( cast_ty . clone ( ) ) ) ;
612+ // FIXME: propagate the "castable to" expectation
613+ let _inner_ty = self . infer_expr_inner ( * expr, & Expectation :: None ) ;
616614 // FIXME check the cast...
617615 cast_ty
618616 }
@@ -829,7 +827,7 @@ impl<'a> InferenceContext<'a> {
829827 self . infer_expr_coerce ( initializer, & Expectation :: has_type ( elem_ty) ) ;
830828 self . infer_expr (
831829 repeat,
832- & Expectation :: has_type (
830+ & Expectation :: HasType (
833831 TyKind :: Scalar ( Scalar :: Uint ( UintTy :: Usize ) ) . intern ( Interner ) ,
834832 ) ,
835833 ) ;
@@ -852,7 +850,7 @@ impl<'a> InferenceContext<'a> {
852850 TyKind :: Array ( coerce. complete ( ) , len) . intern ( Interner )
853851 }
854852 Expr :: Literal ( lit) => match lit {
855- Literal :: Bool ( ..) => TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ,
853+ Literal :: Bool ( ..) => self . result . standard_types . bool_ . clone ( ) ,
856854 Literal :: String ( ..) => {
857855 TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , TyKind :: Str . intern ( Interner ) )
858856 . intern ( Interner )
@@ -1148,7 +1146,7 @@ impl<'a> InferenceContext<'a> {
11481146 if let Some ( expr) = else_branch {
11491147 self . infer_expr_coerce (
11501148 * expr,
1151- & Expectation :: has_type ( Ty :: new ( Interner , TyKind :: Never ) ) ,
1149+ & Expectation :: HasType ( self . result . standard_types . never . clone ( ) ) ,
11521150 ) ;
11531151 }
11541152
0 commit comments