Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/expr.rs')
| -rw-r--r-- | crates/hir-ty/src/infer/expr.rs | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs index 3356c4d78a..df17cc3877 100644 --- a/crates/hir-ty/src/infer/expr.rs +++ b/crates/hir-ty/src/infer/expr.rs @@ -43,7 +43,7 @@ use crate::{ }; use super::{ - BreakableContext, Diverges, Expectation, InferenceContext, InferenceDiagnostic, + BreakableContext, Diverges, Expectation, InferenceContext, InferenceDiagnostic, ReturnKind, cast::CastCheck, find_breakable, }; @@ -576,7 +576,7 @@ impl<'db> InferenceContext<'_, 'db> { self.types.types.never } &Expr::Return { expr } => self.infer_expr_return(tgt_expr, expr), - &Expr::Become { expr } => self.infer_expr_become(expr), + &Expr::Become { expr } => self.infer_expr_become(tgt_expr, expr), Expr::Yield { expr } => { if let Some((resume_ty, yield_ty)) = self.resume_yield_tys { if let Some(expr) = expr { @@ -1454,7 +1454,10 @@ impl<'db> InferenceContext<'_, 'db> { } } None => { - // FIXME: diagnose return outside of function + self.push_diagnostic(InferenceDiagnostic::ReturnOutsideFunction { + expr: ret, + kind: ReturnKind::ReturnExpr, + }); if let Some(expr) = expr { self.infer_expr_no_expect(expr, ExprIsRead::Yes); } @@ -1463,7 +1466,7 @@ impl<'db> InferenceContext<'_, 'db> { self.types.types.never } - fn infer_expr_become(&mut self, expr: ExprId) -> Ty<'db> { + fn infer_expr_become(&mut self, tgt_expr: ExprId, expr: ExprId) -> Ty<'db> { match &self.return_coercion { Some(return_coercion) => { let ret_ty = return_coercion.expected_ty(); @@ -1476,7 +1479,10 @@ impl<'db> InferenceContext<'_, 'db> { _ = self.demand_eqtype(expr.into(), call_expr_ty, ret_ty); } None => { - // FIXME: diagnose `become` outside of functions + self.push_diagnostic(InferenceDiagnostic::ReturnOutsideFunction { + expr: tgt_expr, + kind: ReturnKind::BecomeExpr, + }); self.infer_expr_no_expect(expr, ExprIsRead::Yes); } } |