Rollup merge of #106164 - compiler-errors:check-region-tweak, r=oli-obk
Move `check_region_obligations_and_report_errors` to `TypeErrCtxt` Makes sense for this function to live with its sibling `resolve_regions_and_report_errors`, around which it's basically just a wrapper.
This commit is contained in:
commit
7779386a3a
7 changed files with 34 additions and 31 deletions
|
@ -468,7 +468,7 @@ fn check_opaque_meets_bounds<'tcx>(
|
||||||
// Can have different predicates to their defining use
|
// Can have different predicates to their defining use
|
||||||
hir::OpaqueTyOrigin::TyAlias => {
|
hir::OpaqueTyOrigin::TyAlias => {
|
||||||
let outlives_environment = OutlivesEnvironment::new(param_env);
|
let outlives_environment = OutlivesEnvironment::new(param_env);
|
||||||
let _ = infcx.check_region_obligations_and_report_errors(
|
let _ = infcx.err_ctxt().check_region_obligations_and_report_errors(
|
||||||
defining_use_anchor,
|
defining_use_anchor,
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
);
|
);
|
||||||
|
|
|
@ -615,7 +615,7 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
|
||||||
Some(infcx),
|
Some(infcx),
|
||||||
infcx.implied_bounds_tys(param_env, impl_m_hir_id, wf_tys),
|
infcx.implied_bounds_tys(param_env, impl_m_hir_id, wf_tys),
|
||||||
);
|
);
|
||||||
infcx.check_region_obligations_and_report_errors(
|
infcx.err_ctxt().check_region_obligations_and_report_errors(
|
||||||
impl_m.def_id.expect_local(),
|
impl_m.def_id.expect_local(),
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
)?;
|
)?;
|
||||||
|
@ -1643,8 +1643,9 @@ pub(super) fn compare_impl_const_raw(
|
||||||
}
|
}
|
||||||
|
|
||||||
let outlives_environment = OutlivesEnvironment::new(param_env);
|
let outlives_environment = OutlivesEnvironment::new(param_env);
|
||||||
infcx.check_region_obligations_and_report_errors(impl_const_item_def, &outlives_environment)?;
|
infcx
|
||||||
|
.err_ctxt()
|
||||||
|
.check_region_obligations_and_report_errors(impl_const_item_def, &outlives_environment)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1752,7 +1753,7 @@ fn compare_type_predicate_entailment<'tcx>(
|
||||||
// Finally, resolve all regions. This catches wily misuses of
|
// Finally, resolve all regions. This catches wily misuses of
|
||||||
// lifetime parameters.
|
// lifetime parameters.
|
||||||
let outlives_environment = OutlivesEnvironment::new(param_env);
|
let outlives_environment = OutlivesEnvironment::new(param_env);
|
||||||
infcx.check_region_obligations_and_report_errors(
|
infcx.err_ctxt().check_region_obligations_and_report_errors(
|
||||||
impl_ty.def_id.expect_local(),
|
impl_ty.def_id.expect_local(),
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
)?;
|
)?;
|
||||||
|
@ -1966,7 +1967,7 @@ pub(super) fn check_type_bounds<'tcx>(
|
||||||
let outlives_environment =
|
let outlives_environment =
|
||||||
OutlivesEnvironment::with_bounds(param_env, Some(&infcx), implied_bounds);
|
OutlivesEnvironment::with_bounds(param_env, Some(&infcx), implied_bounds);
|
||||||
|
|
||||||
infcx.check_region_obligations_and_report_errors(
|
infcx.err_ctxt().check_region_obligations_and_report_errors(
|
||||||
impl_ty.def_id.expect_local(),
|
impl_ty.def_id.expect_local(),
|
||||||
&outlives_environment,
|
&outlives_environment,
|
||||||
)?;
|
)?;
|
||||||
|
|
|
@ -116,7 +116,9 @@ pub(super) fn enter_wf_checking_ctxt<'tcx, F>(
|
||||||
let outlives_environment =
|
let outlives_environment =
|
||||||
OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
||||||
|
|
||||||
let _ = infcx.check_region_obligations_and_report_errors(body_def_id, &outlives_environment);
|
let _ = infcx
|
||||||
|
.err_ctxt()
|
||||||
|
.check_region_obligations_and_report_errors(body_def_id, &outlives_environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_well_formed(tcx: TyCtxt<'_>, def_id: hir::OwnerId) {
|
fn check_well_formed(tcx: TyCtxt<'_>, def_id: hir::OwnerId) {
|
||||||
|
|
|
@ -325,7 +325,9 @@ fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDef
|
||||||
|
|
||||||
// Finally, resolve all regions.
|
// Finally, resolve all regions.
|
||||||
let outlives_env = OutlivesEnvironment::new(param_env);
|
let outlives_env = OutlivesEnvironment::new(param_env);
|
||||||
let _ = infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
let _ = infcx
|
||||||
|
.err_ctxt()
|
||||||
|
.check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -565,7 +567,7 @@ pub fn coerce_unsized_info<'tcx>(tcx: TyCtxt<'tcx>, impl_did: DefId) -> CoerceUn
|
||||||
|
|
||||||
// Finally, resolve all regions.
|
// Finally, resolve all regions.
|
||||||
let outlives_env = OutlivesEnvironment::new(param_env);
|
let outlives_env = OutlivesEnvironment::new(param_env);
|
||||||
let _ = infcx.check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
let _ = infcx.err_ctxt().check_region_obligations_and_report_errors(impl_did, &outlives_env);
|
||||||
|
|
||||||
CoerceUnsizedInfo { custom_kind: kind }
|
CoerceUnsizedInfo { custom_kind: kind }
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,7 +181,8 @@ fn get_impl_substs(
|
||||||
|
|
||||||
let implied_bounds = infcx.implied_bounds_tys(param_env, impl1_hir_id, assumed_wf_types);
|
let implied_bounds = infcx.implied_bounds_tys(param_env, impl1_hir_id, assumed_wf_types);
|
||||||
let outlives_env = OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
let outlives_env = OutlivesEnvironment::with_bounds(param_env, Some(infcx), implied_bounds);
|
||||||
let _ = infcx.check_region_obligations_and_report_errors(impl1_def_id, &outlives_env);
|
let _ =
|
||||||
|
infcx.err_ctxt().check_region_obligations_and_report_errors(impl1_def_id, &outlives_env);
|
||||||
let Ok(impl2_substs) = infcx.fully_resolve(impl2_substs) else {
|
let Ok(impl2_substs) = infcx.fully_resolve(impl2_substs) else {
|
||||||
let span = tcx.def_span(impl1_def_id);
|
let span = tcx.def_span(impl1_def_id);
|
||||||
tcx.sess.emit_err(SubstsOnOverriddenImpl { span });
|
tcx.sess.emit_err(SubstsOnOverriddenImpl { span });
|
||||||
|
|
|
@ -1679,13 +1679,29 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
|
/// Processes registered region obliations and resolves regions, reporting
|
||||||
|
/// any errors if any were raised. Prefer using this function over manually
|
||||||
|
/// calling `resolve_regions_and_report_errors`.
|
||||||
|
pub fn check_region_obligations_and_report_errors(
|
||||||
|
&self,
|
||||||
|
generic_param_scope: LocalDefId,
|
||||||
|
outlives_env: &OutlivesEnvironment<'tcx>,
|
||||||
|
) -> Result<(), ErrorGuaranteed> {
|
||||||
|
self.process_registered_region_obligations(
|
||||||
|
outlives_env.region_bound_pairs(),
|
||||||
|
outlives_env.param_env,
|
||||||
|
);
|
||||||
|
|
||||||
|
self.resolve_regions_and_report_errors(generic_param_scope, outlives_env)
|
||||||
|
}
|
||||||
|
|
||||||
/// Process the region constraints and report any errors that
|
/// Process the region constraints and report any errors that
|
||||||
/// result. After this, no more unification operations should be
|
/// result. After this, no more unification operations should be
|
||||||
/// done -- or the compiler will panic -- but it is legal to use
|
/// done -- or the compiler will panic -- but it is legal to use
|
||||||
/// `resolve_vars_if_possible` as well as `fully_resolve`.
|
/// `resolve_vars_if_possible` as well as `fully_resolve`.
|
||||||
///
|
///
|
||||||
/// Make sure to call [`InferCtxt::process_registered_region_obligations`]
|
/// Make sure to call [`InferCtxt::process_registered_region_obligations`]
|
||||||
/// first, or preferably use [`InferCtxt::check_region_obligations_and_report_errors`]
|
/// first, or preferably use [`TypeErrCtxt::check_region_obligations_and_report_errors`]
|
||||||
/// to do both of these operations together.
|
/// to do both of these operations together.
|
||||||
pub fn resolve_regions_and_report_errors(
|
pub fn resolve_regions_and_report_errors(
|
||||||
&self,
|
&self,
|
||||||
|
|
|
@ -60,7 +60,6 @@
|
||||||
//! imply that `'b: 'a`.
|
//! imply that `'b: 'a`.
|
||||||
|
|
||||||
use crate::infer::outlives::components::{push_outlives_components, Component};
|
use crate::infer::outlives::components::{push_outlives_components, Component};
|
||||||
use crate::infer::outlives::env::OutlivesEnvironment;
|
|
||||||
use crate::infer::outlives::env::RegionBoundPairs;
|
use crate::infer::outlives::env::RegionBoundPairs;
|
||||||
use crate::infer::outlives::verify::VerifyBoundCx;
|
use crate::infer::outlives::verify::VerifyBoundCx;
|
||||||
use crate::infer::{
|
use crate::infer::{
|
||||||
|
@ -68,9 +67,7 @@ use crate::infer::{
|
||||||
};
|
};
|
||||||
use crate::traits::{ObligationCause, ObligationCauseCode};
|
use crate::traits::{ObligationCause, ObligationCauseCode};
|
||||||
use rustc_data_structures::undo_log::UndoLogs;
|
use rustc_data_structures::undo_log::UndoLogs;
|
||||||
use rustc_errors::ErrorGuaranteed;
|
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
|
||||||
use rustc_middle::mir::ConstraintCategory;
|
use rustc_middle::mir::ConstraintCategory;
|
||||||
use rustc_middle::ty::subst::GenericArgKind;
|
use rustc_middle::ty::subst::GenericArgKind;
|
||||||
use rustc_middle::ty::{self, Region, SubstsRef, Ty, TyCtxt, TypeVisitable};
|
use rustc_middle::ty::{self, Region, SubstsRef, Ty, TyCtxt, TypeVisitable};
|
||||||
|
@ -116,7 +113,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
std::mem::take(&mut self.inner.borrow_mut().region_obligations)
|
std::mem::take(&mut self.inner.borrow_mut().region_obligations)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// NOTE: Prefer using [`InferCtxt::check_region_obligations_and_report_errors`]
|
/// NOTE: Prefer using `TypeErrCtxt::check_region_obligations_and_report_errors`
|
||||||
/// instead of calling this directly.
|
/// instead of calling this directly.
|
||||||
///
|
///
|
||||||
/// Process the region obligations that must be proven (during
|
/// Process the region obligations that must be proven (during
|
||||||
|
@ -170,22 +167,6 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
outlives.type_must_outlive(origin, sup_type, sub_region, category);
|
outlives.type_must_outlive(origin, sup_type, sub_region, category);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Processes registered region obliations and resolves regions, reporting
|
|
||||||
/// any errors if any were raised. Prefer using this function over manually
|
|
||||||
/// calling `resolve_regions_and_report_errors`.
|
|
||||||
pub fn check_region_obligations_and_report_errors(
|
|
||||||
&self,
|
|
||||||
generic_param_scope: LocalDefId,
|
|
||||||
outlives_env: &OutlivesEnvironment<'tcx>,
|
|
||||||
) -> Result<(), ErrorGuaranteed> {
|
|
||||||
self.process_registered_region_obligations(
|
|
||||||
outlives_env.region_bound_pairs(),
|
|
||||||
outlives_env.param_env,
|
|
||||||
);
|
|
||||||
|
|
||||||
self.err_ctxt().resolve_regions_and_report_errors(generic_param_scope, outlives_env)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The `TypeOutlives` struct has the job of "lowering" a `T: 'a`
|
/// The `TypeOutlives` struct has the job of "lowering" a `T: 'a`
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue