@@ -502,6 +502,7 @@ impl InferenceContext<'_> {
502
502
self . result . standard_types . never . clone ( )
503
503
}
504
504
& Expr :: Return { expr } => self . infer_expr_return ( tgt_expr, expr) ,
505
+ & Expr :: Become { expr } => self . infer_expr_become ( expr) ,
505
506
Expr :: Yield { expr } => {
506
507
if let Some ( ( resume_ty, yield_ty) ) = self . resume_yield_tys . clone ( ) {
507
508
if let Some ( expr) = expr {
@@ -1084,6 +1085,27 @@ impl InferenceContext<'_> {
1084
1085
self . result . standard_types . never . clone ( )
1085
1086
}
1086
1087
1088
+ fn infer_expr_become ( & mut self , expr : ExprId ) -> Ty {
1089
+ match & self . return_coercion {
1090
+ Some ( return_coercion) => {
1091
+ let ret_ty = return_coercion. expected_ty ( ) ;
1092
+
1093
+ let call_expr_ty =
1094
+ self . infer_expr_inner ( expr, & Expectation :: HasType ( ret_ty. clone ( ) ) ) ;
1095
+
1096
+ // NB: this should *not* coerce.
1097
+ // tail calls don't support any coercions except lifetimes ones (like `&'static u8 -> &'a u8`).
1098
+ self . unify ( & call_expr_ty, & ret_ty) ;
1099
+ }
1100
+ None => {
1101
+ // FIXME: diagnose `become` outside of functions
1102
+ self . infer_expr_no_expect ( expr) ;
1103
+ }
1104
+ }
1105
+
1106
+ self . result . standard_types . never . clone ( )
1107
+ }
1108
+
1087
1109
fn infer_expr_box ( & mut self , inner_expr : ExprId , expected : & Expectation ) -> Ty {
1088
1110
if let Some ( box_id) = self . resolve_boxed_box ( ) {
1089
1111
let table = & mut self . table ;
0 commit comments