Skip to content

Commit eff708f

Browse files
committed
add comments
1 parent 1ed4bb5 commit eff708f

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

compiler/rustc_trait_selection/src/traits/error_reporting/type_err_ctxt_ext.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -1057,31 +1057,35 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
10571057
// For each method in the chain, see if this is `Result::map_err` or
10581058
// `Option::ok_or_else` and if it is, see if the closure passed to it has an incorrect
10591059
// trailing `;`.
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
10641060
if let Some(ty) = get_e_type(prev_ty)
10651061
&& let Some(found_ty) = found_ty
1062+
// Ideally we would instead use `FnCtxt::lookup_method_for_diagnostic` for 100%
1063+
// accurate check, but we are in the wrong stage to do that and looking for
1064+
// `Result::map_err` by checking the Self type and the path segment is enough.
1065+
// sym::ok_or_else
10661066
&& (
1067-
(
1067+
( // Result::map_err
10681068
path_segment.ident.name == sym::map_err
10691069
&& is_diagnostic_item(sym::Result, next_ty)
1070-
) || (
1070+
) || ( // Option::ok_or_else
10711071
path_segment.ident.name == sym::ok_or_else
10721072
&& is_diagnostic_item(sym::Option, next_ty)
10731073
)
10741074
)
1075-
&& [sym::map_err, sym::ok_or_else].contains(&path_segment.ident.name)
1075+
// Found `Result<_, ()>?`
10761076
&& let ty::Tuple(tys) = found_ty.kind()
10771077
&& tys.is_empty()
1078+
// The current method call returns `Result<_, ()>`
10781079
&& self.can_eq(obligation.param_env, ty, found_ty)
1080+
// There's a single argument in the method call and it is a closure
10791081
&& args.len() == 1
10801082
&& let Some(arg) = args.get(0)
10811083
&& let hir::ExprKind::Closure(closure) = arg.kind
1084+
// The closure has a block for its body with no tail expression
10821085
&& let body = self.tcx.hir().body(closure.body)
10831086
&& let hir::ExprKind::Block(block, _) = body.value.kind
10841087
&& let None = block.expr
1088+
// The last statement is of a type that can be converted to the return error type
10851089
&& let [.., stmt] = block.stmts
10861090
&& let hir::StmtKind::Semi(expr) = stmt.kind
10871091
&& let expr_ty = self.resolve_vars_if_possible(

0 commit comments

Comments
 (0)