@@ -507,6 +507,7 @@ impl<'a> InferenceContext<'a> {
507
507
self . result . standard_types . never . clone ( )
508
508
}
509
509
& Expr :: Return { expr } => self . infer_expr_return ( tgt_expr, expr) ,
510
+ & Expr :: Become { expr } => self . infer_expr_become ( expr) ,
510
511
Expr :: Yield { expr } => {
511
512
if let Some ( ( resume_ty, yield_ty) ) = self . resume_yield_tys . clone ( ) {
512
513
if let Some ( expr) = expr {
@@ -1052,6 +1053,27 @@ impl<'a> InferenceContext<'a> {
1052
1053
self . result . standard_types . never . clone ( )
1053
1054
}
1054
1055
1056
+ fn infer_expr_become ( & mut self , expr : ExprId ) -> Ty {
1057
+ match & self . return_coercion {
1058
+ Some ( return_coercion) => {
1059
+ let ret_ty = return_coercion. expected_ty ( ) ;
1060
+
1061
+ let call_expr_ty =
1062
+ self . infer_expr_inner ( expr, & Expectation :: HasType ( ret_ty. clone ( ) ) ) ;
1063
+
1064
+ // NB: this should *not* coerce.
1065
+ // tail calls don't support any coercions except lifetimes ones (like `&'static u8 -> &'a u8`).
1066
+ self . unify ( & call_expr_ty, & ret_ty) ;
1067
+ }
1068
+ None => {
1069
+ // FIXME: diagnose `become` outside of functions
1070
+ self . infer_expr_no_expect ( expr) ;
1071
+ }
1072
+ }
1073
+
1074
+ self . result . standard_types . never . clone ( )
1075
+ }
1076
+
1055
1077
fn infer_expr_box ( & mut self , inner_expr : ExprId , expected : & Expectation ) -> Ty {
1056
1078
if let Some ( box_id) = self . resolve_boxed_box ( ) {
1057
1079
let table = & mut self . table ;
0 commit comments