@@ -513,6 +513,7 @@ impl<'a> InferenceContext<'a> {
513513 self . result . standard_types . never . clone ( )
514514 }
515515 & Expr :: Return { expr } => self . infer_expr_return ( expr) ,
516+ & Expr :: Become { expr } => self . infer_expr_become ( expr) ,
516517 Expr :: Yield { expr } => {
517518 if let Some ( ( resume_ty, yield_ty) ) = self . resume_yield_tys . clone ( ) {
518519 if let Some ( expr) = expr {
@@ -1022,6 +1023,27 @@ impl<'a> InferenceContext<'a> {
10221023 self . result . standard_types . never . clone ( )
10231024 }
10241025
1026+ fn infer_expr_become ( & mut self , expr : ExprId ) -> Ty {
1027+ match & self . return_coercion {
1028+ Some ( return_coercion) => {
1029+ let ret_ty = return_coercion. expected_ty ( ) ;
1030+
1031+ let call_expr_ty =
1032+ self . infer_expr_inner ( expr, & Expectation :: HasType ( ret_ty. clone ( ) ) ) ;
1033+
1034+ // NB: this should *not* coerce.
1035+ // tail calls don't support any coercions except lifetimes ones (like `&'static u8 -> &'a u8`).
1036+ self . unify ( & call_expr_ty, & ret_ty) ;
1037+ }
1038+ None => {
1039+ // FIXME: diagnose `become` outside of functions
1040+ self . infer_expr_no_expect ( expr) ;
1041+ }
1042+ }
1043+
1044+ self . result . standard_types . never . clone ( )
1045+ }
1046+
10251047 fn infer_expr_box ( & mut self , inner_expr : ExprId , expected : & Expectation ) -> Ty {
10261048 if let Some ( box_id) = self . resolve_boxed_box ( ) {
10271049 let table = & mut self . table ;
0 commit comments