@@ -87,16 +87,15 @@ impl<'a> InferenceContext<'a> {
87
87
let expected = & expected. adjust_for_branches ( & mut self . table ) ;
88
88
self . infer_expr (
89
89
condition,
90
- & Expectation :: has_type ( TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ) ,
90
+ & Expectation :: HasType ( self . result . standard_types . bool_ . clone ( ) ) ,
91
91
) ;
92
92
93
93
let condition_diverges = mem:: replace ( & mut self . diverges , Diverges :: Maybe ) ;
94
94
let mut both_arms_diverge = Diverges :: Always ;
95
95
96
- let result_ty = self . table . new_type_var ( ) ;
97
96
let then_ty = self . infer_expr_inner ( then_branch, expected) ;
98
97
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 ) ) ;
100
99
coerce. coerce ( self , Some ( then_branch) , & then_ty) ;
101
100
let else_ty = match else_branch {
102
101
Some ( else_branch) => self . infer_expr_inner ( else_branch, expected) ,
@@ -113,7 +112,7 @@ impl<'a> InferenceContext<'a> {
113
112
& Expr :: Let { pat, expr } => {
114
113
let input_ty = self . infer_expr ( expr, & Expectation :: none ( ) ) ;
115
114
self . infer_pat ( pat, & input_ty, BindingMode :: default ( ) ) ;
116
- TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner )
115
+ self . result . standard_types . bool_ . clone ( )
117
116
}
118
117
Expr :: Block { statements, tail, label, id : _ } => {
119
118
let old_resolver = mem:: replace (
@@ -188,27 +187,29 @@ impl<'a> InferenceContext<'a> {
188
187
. intern ( Interner )
189
188
}
190
189
& Expr :: Loop { body, label } => {
190
+ // FIXME: should be:
191
+ // let ty = expected.coercion_target_type(&mut self.table);
191
192
let ty = self . table . new_type_var ( ) ;
192
193
let ( breaks, ( ) ) =
193
194
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 ( ) ) ) ;
195
196
} ) ;
196
197
197
198
match breaks {
198
199
Some ( breaks) => {
199
200
self . diverges = Diverges :: Maybe ;
200
201
breaks
201
202
}
202
- None => TyKind :: Never . intern ( Interner ) ,
203
+ None => self . result . standard_types . never . clone ( ) ,
203
204
}
204
205
}
205
206
& Expr :: While { condition, body, label } => {
206
207
self . with_breakable_ctx ( BreakableKind :: Loop , self . err_ty ( ) , label, |this| {
207
208
this. infer_expr (
208
209
condition,
209
- & Expectation :: has_type ( TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ) ,
210
+ & Expectation :: HasType ( this . result . standard_types . bool_ . clone ( ) ) ,
210
211
) ;
211
- this. infer_expr ( body, & Expectation :: has_type ( TyBuilder :: unit ( ) ) ) ;
212
+ this. infer_expr ( body, & Expectation :: HasType ( TyBuilder :: unit ( ) ) ) ;
212
213
} ) ;
213
214
214
215
// the body may not run, so it diverging doesn't mean we diverge
@@ -224,7 +225,7 @@ impl<'a> InferenceContext<'a> {
224
225
225
226
self . infer_pat ( pat, & pat_ty, BindingMode :: default ( ) ) ;
226
227
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 ( ) ) ) ;
228
229
} ) ;
229
230
230
231
// the body may not run, so it diverging doesn't mean we diverge
@@ -382,12 +383,9 @@ impl<'a> InferenceContext<'a> {
382
383
let expected = expected. adjust_for_branches ( & mut self . table ) ;
383
384
384
385
let result_ty = if arms. is_empty ( ) {
385
- TyKind :: Never . intern ( Interner )
386
+ self . result . standard_types . never . clone ( )
386
387
} 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 )
391
389
} ;
392
390
let mut coerce = CoerceMany :: new ( result_ty) ;
393
391
@@ -400,7 +398,7 @@ impl<'a> InferenceContext<'a> {
400
398
if let Some ( guard_expr) = arm. guard {
401
399
self . infer_expr (
402
400
guard_expr,
403
- & Expectation :: has_type ( TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ) ,
401
+ & Expectation :: HasType ( self . result . standard_types . bool_ . clone ( ) ) ,
404
402
) ;
405
403
}
406
404
@@ -425,7 +423,7 @@ impl<'a> InferenceContext<'a> {
425
423
is_break : false ,
426
424
} ) ;
427
425
} ;
428
- TyKind :: Never . intern ( Interner )
426
+ self . result . standard_types . never . clone ( )
429
427
}
430
428
Expr :: Break { expr, label } => {
431
429
let val_ty = if let Some ( expr) = * expr {
@@ -439,7 +437,7 @@ impl<'a> InferenceContext<'a> {
439
437
// avoiding the borrowck
440
438
let mut coerce = mem:: replace (
441
439
& mut ctxt. coerce ,
442
- CoerceMany :: new ( self . result . standard_types . unknown . clone ( ) ) ,
440
+ CoerceMany :: new ( expected . coercion_target_type ( & mut self . table ) ) ,
443
441
) ;
444
442
445
443
// FIXME: create a synthetic `()` during lowering so we have something to refer to here?
@@ -457,7 +455,7 @@ impl<'a> InferenceContext<'a> {
457
455
} ) ;
458
456
}
459
457
}
460
- TyKind :: Never . intern ( Interner )
458
+ self . result . standard_types . never . clone ( )
461
459
}
462
460
Expr :: Return { expr } => {
463
461
if let Some ( expr) = expr {
@@ -466,7 +464,7 @@ impl<'a> InferenceContext<'a> {
466
464
let unit = TyBuilder :: unit ( ) ;
467
465
let _ = self . coerce ( Some ( tgt_expr) , & unit, & self . return_ty . clone ( ) ) ;
468
466
}
469
- TyKind :: Never . intern ( Interner )
467
+ self . result . standard_types . never . clone ( )
470
468
}
471
469
Expr :: Yield { expr } => {
472
470
if let Some ( ( resume_ty, yield_ty) ) = self . resume_yield_tys . clone ( ) {
@@ -479,14 +477,14 @@ impl<'a> InferenceContext<'a> {
479
477
resume_ty
480
478
} else {
481
479
// FIXME: report error (yield expr in non-generator)
482
- TyKind :: Error . intern ( Interner )
480
+ self . result . standard_types . unknown . clone ( )
483
481
}
484
482
}
485
483
Expr :: Yeet { expr } => {
486
484
if let & Some ( expr) = expr {
487
485
self . infer_expr_inner ( expr, & Expectation :: None ) ;
488
486
}
489
- TyKind :: Never . intern ( Interner )
487
+ self . result . standard_types . never . clone ( )
490
488
}
491
489
Expr :: RecordLit { path, fields, spread, .. } => {
492
490
let ( ty, def_id) = self . resolve_variant ( path. as_deref ( ) , false ) ;
@@ -611,8 +609,8 @@ impl<'a> InferenceContext<'a> {
611
609
}
612
610
Expr :: Cast { expr, type_ref } => {
613
611
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 ) ;
616
614
// FIXME check the cast...
617
615
cast_ty
618
616
}
@@ -829,7 +827,7 @@ impl<'a> InferenceContext<'a> {
829
827
self . infer_expr_coerce ( initializer, & Expectation :: has_type ( elem_ty) ) ;
830
828
self . infer_expr (
831
829
repeat,
832
- & Expectation :: has_type (
830
+ & Expectation :: HasType (
833
831
TyKind :: Scalar ( Scalar :: Uint ( UintTy :: Usize ) ) . intern ( Interner ) ,
834
832
) ,
835
833
) ;
@@ -852,7 +850,7 @@ impl<'a> InferenceContext<'a> {
852
850
TyKind :: Array ( coerce. complete ( ) , len) . intern ( Interner )
853
851
}
854
852
Expr :: Literal ( lit) => match lit {
855
- Literal :: Bool ( ..) => TyKind :: Scalar ( Scalar :: Bool ) . intern ( Interner ) ,
853
+ Literal :: Bool ( ..) => self . result . standard_types . bool_ . clone ( ) ,
856
854
Literal :: String ( ..) => {
857
855
TyKind :: Ref ( Mutability :: Not , static_lifetime ( ) , TyKind :: Str . intern ( Interner ) )
858
856
. intern ( Interner )
@@ -1148,7 +1146,7 @@ impl<'a> InferenceContext<'a> {
1148
1146
if let Some ( expr) = else_branch {
1149
1147
self . infer_expr_coerce (
1150
1148
* expr,
1151
- & Expectation :: has_type ( Ty :: new ( Interner , TyKind :: Never ) ) ,
1149
+ & Expectation :: HasType ( self . result . standard_types . never . clone ( ) ) ,
1152
1150
) ;
1153
1151
}
1154
1152
0 commit comments