@@ -1055,31 +1055,35 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
1055
1055
// For each method in the chain, see if this is `Result::map_err` or
1056
1056
// `Option::ok_or_else` and if it is, see if the closure passed to it has an incorrect
1057
1057
// trailing `;`.
1058
- // Ideally we would instead use `FnCtxt::lookup_method_for_diagnostic` for 100%
1059
- // accurate check, but we are in the wrong stage to do that and looking for
1060
- // `Result::map_err` by checking the Self type and the path segment is enough.
1061
- // sym::ok_or_else
1062
1058
if let Some ( ty) = get_e_type ( prev_ty)
1063
1059
&& let Some ( found_ty) = found_ty
1060
+ // Ideally we would instead use `FnCtxt::lookup_method_for_diagnostic` for 100%
1061
+ // accurate check, but we are in the wrong stage to do that and looking for
1062
+ // `Result::map_err` by checking the Self type and the path segment is enough.
1063
+ // sym::ok_or_else
1064
1064
&& (
1065
- (
1065
+ ( // Result::map_err
1066
1066
path_segment. ident . name == sym:: map_err
1067
1067
&& is_diagnostic_item ( sym:: Result , next_ty)
1068
- ) || (
1068
+ ) || ( // Option::ok_or_else
1069
1069
path_segment. ident . name == sym:: ok_or_else
1070
1070
&& is_diagnostic_item ( sym:: Option , next_ty)
1071
1071
)
1072
1072
)
1073
- && [ sym :: map_err , sym :: ok_or_else ] . contains ( & path_segment . ident . name )
1073
+ // Found `Result<_, ()>?`
1074
1074
&& let ty:: Tuple ( tys) = found_ty. kind ( )
1075
1075
&& tys. is_empty ( )
1076
+ // The current method call returns `Result<_, ()>`
1076
1077
&& self . can_eq ( obligation. param_env , ty, found_ty)
1078
+ // There's a single argument in the method call and it is a closure
1077
1079
&& args. len ( ) == 1
1078
1080
&& let Some ( arg) = args. get ( 0 )
1079
1081
&& let hir:: ExprKind :: Closure ( closure) = arg. kind
1082
+ // The closure has a block for its body with no tail expression
1080
1083
&& let body = self . tcx . hir ( ) . body ( closure. body )
1081
1084
&& let hir:: ExprKind :: Block ( block, _) = body. value . kind
1082
1085
&& let None = block. expr
1086
+ // The last statement is of a type that can be converted to the return error type
1083
1087
&& let [ .., stmt] = block. stmts
1084
1088
&& let hir:: StmtKind :: Semi ( expr) = stmt. kind
1085
1089
&& let expr_ty = self . resolve_vars_if_possible (
0 commit comments