Check Sizedness of return type in WF
This commit is contained in:
parent
f2c4ccd852
commit
23ab0f2cdc
42 changed files with 564 additions and 507 deletions
|
@ -703,7 +703,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
};
|
||||
|
||||
self.note_obligation_cause(&mut err, &obligation);
|
||||
self.point_at_returns_when_relevant(&mut err, &obligation);
|
||||
err.emit()
|
||||
}
|
||||
}
|
||||
|
@ -806,7 +805,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
"Async",
|
||||
);
|
||||
self.note_obligation_cause(&mut err, &obligation);
|
||||
self.point_at_returns_when_relevant(&mut err, &obligation);
|
||||
return Some(err.emit());
|
||||
}
|
||||
}
|
||||
|
@ -852,7 +850,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
"",
|
||||
);
|
||||
self.note_obligation_cause(&mut err, &obligation);
|
||||
self.point_at_returns_when_relevant(&mut err, &obligation);
|
||||
return Some(err.emit());
|
||||
}
|
||||
|
||||
|
@ -868,7 +865,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
kind: expected_kind.as_str(),
|
||||
});
|
||||
self.note_obligation_cause(&mut err, &obligation);
|
||||
self.point_at_returns_when_relevant(&mut err, &obligation);
|
||||
return Some(err.emit());
|
||||
}
|
||||
}
|
||||
|
@ -2826,7 +2822,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
err.span_note(self.tcx.def_span(def_id), "opaque type is declared here");
|
||||
|
||||
self.note_obligation_cause(&mut err, &obligation);
|
||||
self.point_at_returns_when_relevant(&mut err, &obligation);
|
||||
self.dcx().try_steal_replace_and_emit_err(self.tcx.def_span(def_id), StashKey::Cycle, err)
|
||||
}
|
||||
|
||||
|
|
|
@ -185,7 +185,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
suggest_increasing_limit,
|
||||
);
|
||||
self.note_obligation_cause(&mut err, &obligation);
|
||||
self.point_at_returns_when_relevant(&mut err, &obligation);
|
||||
err.emit()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1781,25 +1781,13 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
} else {
|
||||
("dyn ", span.shrink_to_lo())
|
||||
};
|
||||
let alternatively = if visitor
|
||||
.returns
|
||||
.iter()
|
||||
.map(|expr| self.typeck_results.as_ref().unwrap().expr_ty_adjusted_opt(expr))
|
||||
.collect::<FxHashSet<_>>()
|
||||
.len()
|
||||
<= 1
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
impl_span,
|
||||
"consider returning an `impl Trait` instead of a `dyn Trait`",
|
||||
"impl ",
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
"alternatively, "
|
||||
} else {
|
||||
err.help("if there were a single returned type, you could use `impl Trait` instead");
|
||||
""
|
||||
};
|
||||
|
||||
err.span_suggestion_verbose(
|
||||
impl_span,
|
||||
"consider returning an `impl Trait` instead of a `dyn Trait`",
|
||||
"impl ",
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
|
||||
let mut sugg = vec![
|
||||
(span.shrink_to_lo(), format!("Box<{pre}")),
|
||||
|
@ -1831,7 +1819,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
|
||||
err.multipart_suggestion(
|
||||
format!(
|
||||
"{alternatively}box the return type, and wrap all of the returned values in \
|
||||
"alternatively, box the return type, and wrap all of the returned values in \
|
||||
`Box::new`",
|
||||
),
|
||||
sugg,
|
||||
|
@ -1841,41 +1829,6 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
|||
true
|
||||
}
|
||||
|
||||
pub(super) fn point_at_returns_when_relevant(
|
||||
&self,
|
||||
err: &mut Diag<'_>,
|
||||
obligation: &PredicateObligation<'tcx>,
|
||||
) {
|
||||
match obligation.cause.code().peel_derives() {
|
||||
ObligationCauseCode::SizedReturnType => {}
|
||||
_ => return,
|
||||
}
|
||||
|
||||
let hir = self.tcx.hir();
|
||||
let node = self.tcx.hir_node_by_def_id(obligation.cause.body_id);
|
||||
if let hir::Node::Item(hir::Item {
|
||||
kind: hir::ItemKind::Fn { body: body_id, .. }, ..
|
||||
}) = node
|
||||
{
|
||||
let body = hir.body(*body_id);
|
||||
// Point at all the `return`s in the function as they have failed trait bounds.
|
||||
let mut visitor = ReturnsVisitor::default();
|
||||
visitor.visit_body(body);
|
||||
let typeck_results = self.typeck_results.as_ref().unwrap();
|
||||
for expr in &visitor.returns {
|
||||
if let Some(returned_ty) = typeck_results.node_type_opt(expr.hir_id) {
|
||||
let ty = self.resolve_vars_if_possible(returned_ty);
|
||||
if ty.references_error() {
|
||||
// don't print out the [type error] here
|
||||
err.downgrade_to_delayed_bug();
|
||||
} else {
|
||||
err.span_label(expr.span, format!("this returned value is of type `{ty}`"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn report_closure_arg_mismatch(
|
||||
&self,
|
||||
span: Span,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue