Pass ConstraintCategory thorough a few more places
This commit is contained in:
parent
a46376e247
commit
6075877c89
3 changed files with 44 additions and 15 deletions
|
@ -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(
|
||||||
|
|
|
@ -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, ®ion_bound_pairs, None, param_env);
|
&mut TypeOutlives::new(self, self.tcx, ®ion_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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue