1
Fork 0

Pass ConstraintCategory thorough a few more places

This commit is contained in:
Jack Huey 2022-09-16 16:44:18 -04:00
parent a46376e247
commit 6075877c89
3 changed files with 44 additions and 15 deletions

View file

@ -103,13 +103,13 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
bug!("query_constraint {:?} contained bound vars", query_constraint,); bug!("query_constraint {:?} contained bound vars", query_constraint,);
}); });
let _constraint_category = query_constraint.1; let constraint_category = query_constraint.1;
match k1.unpack() { match k1.unpack() {
GenericArgKind::Lifetime(r1) => { GenericArgKind::Lifetime(r1) => {
let r1_vid = self.to_region_vid(r1); let r1_vid = self.to_region_vid(r1);
let r2_vid = self.to_region_vid(r2); let r2_vid = self.to_region_vid(r2);
self.add_outlives(r1_vid, r2_vid); self.add_outlives(r1_vid, r2_vid, constraint_category);
} }
GenericArgKind::Type(t1) => { GenericArgKind::Type(t1) => {
@ -124,7 +124,7 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
Some(implicit_region_bound), Some(implicit_region_bound),
param_env, param_env,
) )
.type_must_outlive(origin, t1, r2); .type_must_outlive(origin, t1, r2, constraint_category);
} }
GenericArgKind::Const(_) => { GenericArgKind::Const(_) => {
@ -171,10 +171,19 @@ impl<'a, 'tcx> ConstraintConversion<'a, 'tcx> {
} }
} }
fn add_outlives(&mut self, sup: ty::RegionVid, sub: ty::RegionVid) { fn add_outlives(
&mut self,
sup: ty::RegionVid,
sub: ty::RegionVid,
category: ConstraintCategory<'tcx>,
) {
let category = match self.category {
ConstraintCategory::Boring | ConstraintCategory::BoringNoLocation => category,
_ => self.category,
};
self.constraints.outlives_constraints.push(OutlivesConstraint { self.constraints.outlives_constraints.push(OutlivesConstraint {
locations: self.locations, locations: self.locations,
category: self.category, category,
span: self.span, span: self.span,
sub, sub,
sup, sup,
@ -194,10 +203,11 @@ impl<'a, 'b, 'tcx> TypeOutlivesDelegate<'tcx> for &'a mut ConstraintConversion<'
_origin: SubregionOrigin<'tcx>, _origin: SubregionOrigin<'tcx>,
a: ty::Region<'tcx>, a: ty::Region<'tcx>,
b: ty::Region<'tcx>, b: ty::Region<'tcx>,
constraint_category: ConstraintCategory<'tcx>,
) { ) {
let b = self.to_region_vid(b); let b = self.to_region_vid(b);
let a = self.to_region_vid(a); let a = self.to_region_vid(a);
self.add_outlives(b, a); self.add_outlives(b, a, constraint_category);
} }
fn push_verify( fn push_verify(

View file

@ -69,6 +69,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_hir::def_id::LocalDefId; use rustc_hir::def_id::LocalDefId;
use rustc_middle::mir::ConstraintCategory;
use rustc_middle::ty::subst::GenericArgKind; use rustc_middle::ty::subst::GenericArgKind;
use rustc_middle::ty::{self, Region, Ty, TyCtxt, TypeVisitable}; use rustc_middle::ty::{self, Region, Ty, TyCtxt, TypeVisitable};
use smallvec::smallvec; use smallvec::smallvec;
@ -163,7 +164,8 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
let outlives = let outlives =
&mut TypeOutlives::new(self, self.tcx, &region_bound_pairs, None, param_env); &mut TypeOutlives::new(self, self.tcx, &region_bound_pairs, None, param_env);
outlives.type_must_outlive(origin, sup_type, sub_region); let category = ConstraintCategory::BoringNoLocation;
outlives.type_must_outlive(origin, sup_type, sub_region, category);
} }
} }
@ -207,6 +209,7 @@ pub trait TypeOutlivesDelegate<'tcx> {
origin: SubregionOrigin<'tcx>, origin: SubregionOrigin<'tcx>,
a: ty::Region<'tcx>, a: ty::Region<'tcx>,
b: ty::Region<'tcx>, b: ty::Region<'tcx>,
constraint_category: ConstraintCategory<'tcx>,
); );
fn push_verify( fn push_verify(
@ -255,12 +258,13 @@ where
origin: infer::SubregionOrigin<'tcx>, origin: infer::SubregionOrigin<'tcx>,
ty: Ty<'tcx>, ty: Ty<'tcx>,
region: ty::Region<'tcx>, region: ty::Region<'tcx>,
category: ConstraintCategory<'tcx>,
) { ) {
assert!(!ty.has_escaping_bound_vars()); assert!(!ty.has_escaping_bound_vars());
let mut components = smallvec![]; let mut components = smallvec![];
push_outlives_components(self.tcx, ty, &mut components); push_outlives_components(self.tcx, ty, &mut components);
self.components_must_outlive(origin, &components, region); self.components_must_outlive(origin, &components, region, category);
} }
fn components_must_outlive( fn components_must_outlive(
@ -268,12 +272,13 @@ where
origin: infer::SubregionOrigin<'tcx>, origin: infer::SubregionOrigin<'tcx>,
components: &[Component<'tcx>], components: &[Component<'tcx>],
region: ty::Region<'tcx>, region: ty::Region<'tcx>,
category: ConstraintCategory<'tcx>,
) { ) {
for component in components.iter() { for component in components.iter() {
let origin = origin.clone(); let origin = origin.clone();
match component { match component {
Component::Region(region1) => { Component::Region(region1) => {
self.delegate.push_sub_region_constraint(origin, region, *region1); self.delegate.push_sub_region_constraint(origin, region, *region1, category);
} }
Component::Param(param_ty) => { Component::Param(param_ty) => {
self.param_ty_must_outlive(origin, region, *param_ty); self.param_ty_must_outlive(origin, region, *param_ty);
@ -282,7 +287,7 @@ where
self.projection_must_outlive(origin, region, *projection_ty); self.projection_must_outlive(origin, region, *projection_ty);
} }
Component::EscapingProjection(subcomponents) => { Component::EscapingProjection(subcomponents) => {
self.components_must_outlive(origin, &subcomponents, region); self.components_must_outlive(origin, &subcomponents, region, category);
} }
Component::UnresolvedInferenceVariable(v) => { Component::UnresolvedInferenceVariable(v) => {
// ignore this, we presume it will yield an error // ignore this, we presume it will yield an error
@ -389,13 +394,19 @@ where
if approx_env_bounds.is_empty() && trait_bounds.is_empty() && needs_infer { if approx_env_bounds.is_empty() && trait_bounds.is_empty() && needs_infer {
debug!("projection_must_outlive: no declared bounds"); debug!("projection_must_outlive: no declared bounds");
let constraint = ConstraintCategory::BoringNoLocation;
for k in projection_ty.substs { for k in projection_ty.substs {
match k.unpack() { match k.unpack() {
GenericArgKind::Lifetime(lt) => { GenericArgKind::Lifetime(lt) => {
self.delegate.push_sub_region_constraint(origin.clone(), region, lt); self.delegate.push_sub_region_constraint(
origin.clone(),
region,
lt,
constraint,
);
} }
GenericArgKind::Type(ty) => { GenericArgKind::Type(ty) => {
self.type_must_outlive(origin.clone(), ty, region); self.type_must_outlive(origin.clone(), ty, region, constraint);
} }
GenericArgKind::Const(_) => { GenericArgKind::Const(_) => {
// Const parameters don't impose constraints. // Const parameters don't impose constraints.
@ -433,7 +444,8 @@ where
let unique_bound = trait_bounds[0]; let unique_bound = trait_bounds[0];
debug!("projection_must_outlive: unique trait bound = {:?}", unique_bound); debug!("projection_must_outlive: unique trait bound = {:?}", unique_bound);
debug!("projection_must_outlive: unique declared bound appears in trait ref"); debug!("projection_must_outlive: unique declared bound appears in trait ref");
self.delegate.push_sub_region_constraint(origin, region, unique_bound); let category = ConstraintCategory::BoringNoLocation;
self.delegate.push_sub_region_constraint(origin, region, unique_bound, category);
return; return;
} }
@ -455,6 +467,7 @@ impl<'cx, 'tcx> TypeOutlivesDelegate<'tcx> for &'cx InferCtxt<'cx, 'tcx> {
origin: SubregionOrigin<'tcx>, origin: SubregionOrigin<'tcx>,
a: ty::Region<'tcx>, a: ty::Region<'tcx>,
b: ty::Region<'tcx>, b: ty::Region<'tcx>,
_constraint_category: ConstraintCategory<'tcx>,
) { ) {
self.sub_regions(origin, a, b) self.sub_regions(origin, a, b)
} }

View file

@ -10,6 +10,7 @@ use rustc_hir::ItemKind;
use rustc_infer::infer::outlives::env::{OutlivesEnvironment, RegionBoundPairs}; use rustc_infer::infer::outlives::env::{OutlivesEnvironment, RegionBoundPairs};
use rustc_infer::infer::outlives::obligations::TypeOutlives; use rustc_infer::infer::outlives::obligations::TypeOutlives;
use rustc_infer::infer::{self, InferCtxt, TyCtxtInferExt}; use rustc_infer::infer::{self, InferCtxt, TyCtxtInferExt};
use rustc_middle::mir::ConstraintCategory;
use rustc_middle::ty::query::Providers; use rustc_middle::ty::query::Providers;
use rustc_middle::ty::subst::{GenericArgKind, InternalSubsts, Subst}; use rustc_middle::ty::subst::{GenericArgKind, InternalSubsts, Subst};
use rustc_middle::ty::trait_def::TraitSpecializationKind; use rustc_middle::ty::trait_def::TraitSpecializationKind;
@ -663,7 +664,7 @@ fn ty_known_to_outlive<'tcx>(
resolve_regions_with_wf_tys(tcx, id, param_env, &wf_tys, |infcx, region_bound_pairs| { resolve_regions_with_wf_tys(tcx, id, param_env, &wf_tys, |infcx, region_bound_pairs| {
let origin = infer::RelateParamBound(DUMMY_SP, ty, None); let origin = infer::RelateParamBound(DUMMY_SP, ty, None);
let outlives = &mut TypeOutlives::new(infcx, tcx, region_bound_pairs, None, param_env); let outlives = &mut TypeOutlives::new(infcx, tcx, region_bound_pairs, None, param_env);
outlives.type_must_outlive(origin, ty, region); outlives.type_must_outlive(origin, ty, region, ConstraintCategory::BoringNoLocation);
}) })
} }
@ -681,7 +682,12 @@ fn region_known_to_outlive<'tcx>(
use rustc_infer::infer::outlives::obligations::TypeOutlivesDelegate; use rustc_infer::infer::outlives::obligations::TypeOutlivesDelegate;
let origin = infer::RelateRegionParamBound(DUMMY_SP); let origin = infer::RelateRegionParamBound(DUMMY_SP);
// `region_a: region_b` -> `region_b <= region_a` // `region_a: region_b` -> `region_b <= region_a`
infcx.push_sub_region_constraint(origin, region_b, region_a); infcx.push_sub_region_constraint(
origin,
region_b,
region_a,
ConstraintCategory::BoringNoLocation,
);
}) })
} }