mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
Rollup merge of #103866 - compiler-errors:fn-ctxt-less-state, r=fee1-dead
Remove some return-type diagnostic booleans from `FnCtxt` These can be calculated on-demand
This commit is contained in:
commit
9e67f6a68d
@ -491,11 +491,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
..
|
||||
} = self.type_var_origin(expected)? else { return None; };
|
||||
|
||||
let sig = *self
|
||||
.typeck_results
|
||||
.borrow()
|
||||
.liberated_fn_sigs()
|
||||
.get(hir::HirId::make_owner(self.body_id.owner.def_id))?;
|
||||
let sig = self.body_fn_sig()?;
|
||||
|
||||
let substs = sig.output().walk().find_map(|arg| {
|
||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||
|
@ -31,13 +31,11 @@ pub(super) fn check_fn<'a, 'tcx>(
|
||||
fn_id: hir::HirId,
|
||||
body: &'tcx hir::Body<'tcx>,
|
||||
can_be_generator: Option<hir::Movability>,
|
||||
return_type_pre_known: bool,
|
||||
) -> (FnCtxt<'a, 'tcx>, Option<GeneratorTypes<'tcx>>) {
|
||||
// Create the function context. This is either derived from scratch or,
|
||||
// in the case of closures, based on the outer context.
|
||||
let mut fcx = FnCtxt::new(inherited, param_env, body.value.hir_id);
|
||||
fcx.ps.set(UnsafetyState::function(fn_sig.unsafety, fn_id));
|
||||
fcx.return_type_pre_known = return_type_pre_known;
|
||||
|
||||
let tcx = fcx.tcx;
|
||||
let hir = tcx.hir();
|
||||
@ -51,9 +49,6 @@ pub(super) fn check_fn<'a, 'tcx>(
|
||||
decl.output.span(),
|
||||
param_env,
|
||||
));
|
||||
// If we replaced declared_ret_ty with infer vars, then we must be inferring
|
||||
// an opaque type, so set a flag so we can improve diagnostics.
|
||||
fcx.return_type_has_opaque = ret_ty != declared_ret_ty;
|
||||
|
||||
fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(ret_ty)));
|
||||
|
||||
|
@ -83,8 +83,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
|
||||
debug!(?bound_sig, ?liberated_sig);
|
||||
|
||||
let return_type_pre_known = !liberated_sig.output().is_ty_infer();
|
||||
|
||||
let generator_types = check_fn(
|
||||
self,
|
||||
self.param_env.without_const(),
|
||||
@ -93,7 +91,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
expr.hir_id,
|
||||
body,
|
||||
gen,
|
||||
return_type_pre_known,
|
||||
)
|
||||
.1;
|
||||
|
||||
|
@ -1782,7 +1782,8 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
||||
// may occur at the first return expression we see in the closure
|
||||
// (if it conflicts with the declared return type). Skip adding a
|
||||
// note in this case, since it would be incorrect.
|
||||
&& !fcx.return_type_pre_known
|
||||
&& let Some(fn_sig) = fcx.body_fn_sig()
|
||||
&& fn_sig.output().is_ty_var()
|
||||
{
|
||||
err.span_note(
|
||||
sp,
|
||||
|
@ -840,7 +840,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
return_expr_ty,
|
||||
);
|
||||
|
||||
if self.return_type_has_opaque {
|
||||
if let Some(fn_sig) = self.body_fn_sig()
|
||||
&& fn_sig.output().has_opaque_types()
|
||||
{
|
||||
// Point any obligations that were registered due to opaque type
|
||||
// inference at the return expression.
|
||||
self.select_obligations_where_possible(false, |errors| {
|
||||
|
@ -118,15 +118,6 @@ pub struct FnCtxt<'a, 'tcx> {
|
||||
pub(super) enclosing_breakables: RefCell<EnclosingBreakables<'tcx>>,
|
||||
|
||||
pub(super) inh: &'a Inherited<'tcx>,
|
||||
|
||||
/// True if the function or closure's return type is known before
|
||||
/// entering the function/closure, i.e. if the return type is
|
||||
/// either given explicitly or inferred from, say, an `Fn*` trait
|
||||
/// bound. Used for diagnostic purposes only.
|
||||
pub(super) return_type_pre_known: bool,
|
||||
|
||||
/// True if the return type has an Opaque type
|
||||
pub(super) return_type_has_opaque: bool,
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
@ -151,8 +142,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
by_id: Default::default(),
|
||||
}),
|
||||
inh,
|
||||
return_type_pre_known: true,
|
||||
return_type_has_opaque: false,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,6 +22,14 @@ use rustc_trait_selection::traits::error_reporting::DefIdOrName;
|
||||
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
|
||||
|
||||
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
pub(crate) fn body_fn_sig(&self) -> Option<ty::FnSig<'tcx>> {
|
||||
self.typeck_results
|
||||
.borrow()
|
||||
.liberated_fn_sigs()
|
||||
.get(self.tcx.hir().get_parent_node(self.body_id))
|
||||
.copied()
|
||||
}
|
||||
|
||||
pub(in super::super) fn suggest_semicolon_at_end(&self, span: Span, err: &mut Diagnostic) {
|
||||
err.span_suggestion_short(
|
||||
span.shrink_to_hi(),
|
||||
|
@ -250,7 +250,7 @@ fn typeck_with_fallback<'tcx>(
|
||||
param_env,
|
||||
fn_sig,
|
||||
);
|
||||
check_fn(&inh, param_env, fn_sig, decl, id, body, None, true).0
|
||||
check_fn(&inh, param_env, fn_sig, decl, id, body, None).0
|
||||
} else {
|
||||
let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id);
|
||||
let expected_type = body_ty
|
||||
|
Loading…
Reference in New Issue
Block a user