@@ -1092,31 +1092,35 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
10921092            // For each method in the chain, see if this is `Result::map_err` or 
10931093            // `Option::ok_or_else` and if it is, see if the closure passed to it has an incorrect 
10941094            // trailing `;`. 
1095-             // Ideally we would instead use `FnCtxt::lookup_method_for_diagnostic` for 100% 
1096-             // accurate check, but we are in the wrong stage to do that and looking for 
1097-             // `Result::map_err` by checking the Self type and the path segment is enough. 
1098-             // sym::ok_or_else 
10991095            if  let  Some ( ty)  = get_e_type ( prev_ty) 
11001096                && let  Some ( found_ty)  = found_ty
1097+                 // Ideally we would instead use `FnCtxt::lookup_method_for_diagnostic` for 100% 
1098+                 // accurate check, but we are in the wrong stage to do that and looking for 
1099+                 // `Result::map_err` by checking the Self type and the path segment is enough. 
1100+                 // sym::ok_or_else 
11011101                && ( 
1102-                     ( 
1102+                     (   // Result::map_err 
11031103                        path_segment. ident . name  == sym:: map_err
11041104                            && is_diagnostic_item ( sym:: Result ,  next_ty) 
1105-                     )  || ( 
1105+                     )  || (   // Option::ok_or_else 
11061106                        path_segment. ident . name  == sym:: ok_or_else
11071107                            && is_diagnostic_item ( sym:: Option ,  next_ty) 
11081108                    ) 
11091109                ) 
1110-                 &&  [ sym :: map_err ,  sym :: ok_or_else ] . contains ( & path_segment . ident . name ) 
1110+                 // Found `Result<_, ()>?` 
11111111                && let  ty:: Tuple ( tys)  = found_ty. kind ( ) 
11121112                && tys. is_empty ( ) 
1113+                 // The current method call returns `Result<_, ()>` 
11131114                && self . can_eq ( obligation. param_env ,  ty,  found_ty) 
1115+                 // There's a single argument in the method call and it is a closure 
11141116                && args. len ( )  == 1 
11151117                && let  Some ( arg)  = args. get ( 0 ) 
11161118                && let  hir:: ExprKind :: Closure ( closure)  = arg. kind 
1119+                 // The closure has a block for its body with no tail expression 
11171120                && let  body = self . tcx . hir ( ) . body ( closure. body ) 
11181121                && let  hir:: ExprKind :: Block ( block,  _)  = body. value . kind 
11191122                && let  None  = block. expr 
1123+                 // The last statement is of a type that can be converted to the return error type 
11201124                && let  [ ..,  stmt]  = block. stmts 
11211125                && let  hir:: StmtKind :: Semi ( expr)  = stmt. kind 
11221126                && let  expr_ty = self . resolve_vars_if_possible ( 
0 commit comments