Skip to content

Commit 047aa5d

Browse files
Auto merge of #144446 - nnethercote:opt-region-constraints, r=<try>
Optimize region constraints
2 parents 3048886 + c7ec775 commit 047aa5d

File tree

11 files changed

+230
-217
lines changed

11 files changed

+230
-217
lines changed

compiler/rustc_borrowck/src/diagnostics/bound_region_errors.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::rc::Rc;
33

44
use rustc_errors::Diag;
55
use rustc_hir::def_id::LocalDefId;
6-
use rustc_infer::infer::region_constraints::{Constraint, RegionConstraintData};
6+
use rustc_infer::infer::region_constraints::{Constraint, ConstraintKind, RegionConstraintData};
77
use rustc_infer::infer::{
88
InferCtxt, RegionResolutionError, RegionVariableOrigin, SubregionOrigin, TyCtxtInferExt as _,
99
};
@@ -455,21 +455,23 @@ fn try_extract_error_from_region_constraints<'a, 'tcx>(
455455
_ => a_region == b_region,
456456
};
457457
let mut check =
458-
|constraint: &Constraint<'tcx>, cause: &SubregionOrigin<'tcx>, exact| match *constraint {
459-
Constraint::RegSubReg(sub, sup)
460-
if ((exact && sup == placeholder_region)
461-
|| (!exact && regions_the_same(sup, placeholder_region)))
462-
&& sup != sub =>
458+
|constraint: &Constraint<'tcx>, cause: &SubregionOrigin<'tcx>, exact| match constraint.kind
459+
{
460+
ConstraintKind::RegSubReg
461+
if ((exact && constraint.sup == placeholder_region)
462+
|| (!exact && regions_the_same(constraint.sup, placeholder_region)))
463+
&& constraint.sup != constraint.sub =>
463464
{
464-
Some((sub, cause.clone()))
465+
Some((constraint.sub, cause.clone()))
465466
}
466-
Constraint::VarSubReg(vid, sup)
467+
ConstraintKind::VarSubReg
467468
if (exact
468-
&& sup == placeholder_region
469-
&& !universe_of_region(vid).can_name(placeholder_universe))
470-
|| (!exact && regions_the_same(sup, placeholder_region)) =>
469+
&& constraint.sup == placeholder_region
470+
&& !universe_of_region(constraint.sub.as_var())
471+
.can_name(placeholder_universe))
472+
|| (!exact && regions_the_same(constraint.sup, placeholder_region)) =>
471473
{
472-
Some((ty::Region::new_var(infcx.tcx, vid), cause.clone()))
474+
Some((constraint.sub, cause.clone()))
473475
}
474476
_ => None,
475477
};

compiler/rustc_infer/src/infer/canonical/query_response.rs

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::infer::canonical::{
2121
Canonical, CanonicalQueryResponse, CanonicalVarValues, Certainty, OriginalQueryValues,
2222
QueryRegionConstraints, QueryResponse,
2323
};
24-
use crate::infer::region_constraints::{Constraint, RegionConstraintData};
24+
use crate::infer::region_constraints::RegionConstraintData;
2525
use crate::infer::{
2626
DefineOpaqueTypes, InferCtxt, InferOk, InferResult, SubregionOrigin, TypeOutlivesConstraint,
2727
};
@@ -105,8 +105,6 @@ impl<'tcx> InferCtxt<'tcx> {
105105
where
106106
T: Debug + TypeFoldable<TyCtxt<'tcx>>,
107107
{
108-
let tcx = self.tcx;
109-
110108
// Select everything, returning errors.
111109
let errors = fulfill_cx.select_all_or_error(self);
112110

@@ -120,7 +118,6 @@ impl<'tcx> InferCtxt<'tcx> {
120118
debug!(?region_obligations);
121119
let region_constraints = self.with_region_constraints(|region_constraints| {
122120
make_query_region_constraints(
123-
tcx,
124121
region_obligations,
125122
region_constraints,
126123
region_assumptions,
@@ -587,7 +584,6 @@ impl<'tcx> InferCtxt<'tcx> {
587584
/// Given the region obligations and constraints scraped from the infcx,
588585
/// creates query region constraints.
589586
pub fn make_query_region_constraints<'tcx>(
590-
tcx: TyCtxt<'tcx>,
591587
outlives_obligations: Vec<TypeOutlivesConstraint<'tcx>>,
592588
region_constraints: &RegionConstraintData<'tcx>,
593589
assumptions: Vec<ty::ArgOutlivesPredicate<'tcx>>,
@@ -601,21 +597,8 @@ pub fn make_query_region_constraints<'tcx>(
601597
let outlives: Vec<_> = constraints
602598
.iter()
603599
.map(|(k, origin)| {
604-
let constraint = match *k {
605-
// Swap regions because we are going from sub (<=) to outlives
606-
// (>=).
607-
Constraint::VarSubVar(v1, v2) => ty::OutlivesPredicate(
608-
ty::Region::new_var(tcx, v2).into(),
609-
ty::Region::new_var(tcx, v1),
610-
),
611-
Constraint::VarSubReg(v1, r2) => {
612-
ty::OutlivesPredicate(r2.into(), ty::Region::new_var(tcx, v1))
613-
}
614-
Constraint::RegSubVar(r1, v2) => {
615-
ty::OutlivesPredicate(ty::Region::new_var(tcx, v2).into(), r1)
616-
}
617-
Constraint::RegSubReg(r1, r2) => ty::OutlivesPredicate(r2.into(), r1),
618-
};
600+
// Swap regions because we are going from sub (<=) to outlives (>=).
601+
let constraint = ty::OutlivesPredicate(k.sup.into(), k.sub);
619602
(constraint, origin.to_constraint_category())
620603
})
621604
.chain(outlives_obligations.into_iter().map(|obl| {

0 commit comments

Comments
 (0)