Don't leak unnameable types in -> _ recover
This commit is contained in:
parent
78bc0a5656
commit
b09c177743
4 changed files with 37 additions and 17 deletions
|
@ -1373,16 +1373,16 @@ fn infer_return_ty_for_fn_sig<'tcx>(
|
|||
// Don't leak types into signatures unless they're nameable!
|
||||
// For example, if a function returns itself, we don't want that
|
||||
// recursive function definition to leak out into the fn sig.
|
||||
let mut should_recover = false;
|
||||
let mut recovered_ret_ty = None;
|
||||
|
||||
if let Some(ret_ty) = ret_ty.make_suggestable(tcx, false, None) {
|
||||
if let Some(suggestable_ret_ty) = ret_ty.make_suggestable(tcx, false, None) {
|
||||
diag.span_suggestion(
|
||||
ty.span,
|
||||
"replace with the correct return type",
|
||||
ret_ty,
|
||||
suggestable_ret_ty,
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
should_recover = true;
|
||||
recovered_ret_ty = Some(suggestable_ret_ty);
|
||||
} else if let Some(sugg) =
|
||||
suggest_impl_trait(&tcx.infer_ctxt().build(), tcx.param_env(def_id), ret_ty)
|
||||
{
|
||||
|
@ -1404,18 +1404,13 @@ fn infer_return_ty_for_fn_sig<'tcx>(
|
|||
}
|
||||
|
||||
let guar = diag.emit();
|
||||
|
||||
if should_recover {
|
||||
ty::Binder::dummy(fn_sig)
|
||||
} else {
|
||||
ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
fn_sig.inputs().iter().copied(),
|
||||
Ty::new_error(tcx, guar),
|
||||
fn_sig.c_variadic,
|
||||
fn_sig.unsafety,
|
||||
fn_sig.abi,
|
||||
))
|
||||
}
|
||||
ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
fn_sig.inputs().iter().copied(),
|
||||
recovered_ret_ty.unwrap_or_else(|| Ty::new_error(tcx, guar)),
|
||||
fn_sig.c_variadic,
|
||||
fn_sig.unsafety,
|
||||
fn_sig.abi,
|
||||
))
|
||||
}
|
||||
None => icx.lowerer().lower_fn_ty(
|
||||
hir_id,
|
||||
|
|
|
@ -236,7 +236,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
|
|||
}
|
||||
|
||||
ty::FnDef(..) | ty::Coroutine(..) | ty::Closure(..) | ty::CoroutineClosure(..) => {
|
||||
bug!("Unexpected coroutine/closure type in variance computation");
|
||||
bug!("Unexpected unnameable type in variance computation: {ty}");
|
||||
}
|
||||
|
||||
ty::Ref(region, ty, mutbl) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue