diff options
| author | Ethan Brierley <ethanboxx@gmail.com> | 2023-10-22 12:05:28 +0100 |
|---|---|---|
| committer | Ethan Brierley <ethanboxx@gmail.com> | 2023-10-22 12:05:28 +0100 |
| commit | 24cdb27e2842e5abab2875ce29c365ac5503773e (patch) | |
| tree | 8542cb33e198eac36fa8621c2f531ec506ea1b4f | |
| parent | 6c97f136126557a982990a1d0ef879996b268cba (diff) | |
| download | rust-24cdb27e2842e5abab2875ce29c365ac5503773e.tar.gz rust-24cdb27e2842e5abab2875ce29c365ac5503773e.zip | |
let_chainify `suggest_coercing_result_via_try_operator`
| -rw-r--r-- | compiler/rustc_hir_typeck/src/demand.rs | 58 |
1 files changed, 22 insertions, 36 deletions
diff --git a/compiler/rustc_hir_typeck/src/demand.rs b/compiler/rustc_hir_typeck/src/demand.rs index 3b09fdda0ce..b385902c286 100644 --- a/compiler/rustc_hir_typeck/src/demand.rs +++ b/compiler/rustc_hir_typeck/src/demand.rs @@ -961,43 +961,29 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { expected: Ty<'tcx>, found: Ty<'tcx>, ) -> bool { - let ty::Adt(e, args_e) = expected.kind() else { - return false; - }; - let ty::Adt(f, args_f) = found.kind() else { - return false; - }; - if e.did() != f.did() { - return false; - } - if Some(e.did()) != self.tcx.get_diagnostic_item(sym::Result) { - return false; - } let map = self.tcx.hir(); - if let Some(hir::Node::Expr(expr)) = map.find_parent(expr.hir_id) - && let hir::ExprKind::Ret(_) = expr.kind - { - // `return foo;` - } else if map.get_return_block(expr.hir_id).is_some() { - // Function's tail expression. - } else { - return false; - } - let e_ok = args_e.type_at(0); - let f_ok = args_f.type_at(0); - if !self.infcx.can_eq(self.param_env, f_ok, e_ok) { - return false; - } - let e = args_e.type_at(1); - let f = args_f.type_at(1); - if self - .infcx - .type_implements_trait( - self.tcx.get_diagnostic_item(sym::Into).unwrap(), - [f, e], - self.param_env, - ) - .must_apply_modulo_regions() + let returned = matches!( + map.find_parent(expr.hir_id), + Some(hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Ret(_), .. })) + ) || map.get_return_block(expr.hir_id).is_some(); + if returned + && let ty::Adt(e, args_e) = expected.kind() + && let ty::Adt(f, args_f) = found.kind() + && e.did() == f.did() + && Some(e.did()) == self.tcx.get_diagnostic_item(sym::Result) + && let e_ok = args_e.type_at(0) + && let f_ok = args_f.type_at(0) + && self.infcx.can_eq(self.param_env, f_ok, e_ok) + && let e_err = args_e.type_at(1) + && let f_err = args_f.type_at(1) + && self + .infcx + .type_implements_trait( + self.tcx.get_diagnostic_item(sym::Into).unwrap(), + [f_err, e_err], + self.param_env, + ) + .must_apply_modulo_regions() { err.multipart_suggestion( "use `?` to coerce and return an appropriate `Err`, and wrap the resulting value \ |
