Skip to content

Commit f93ee19

Browse files
Make ExternalConstraints just carry outlives
1 parent a333943 commit f93ee19

File tree

2 files changed

+23
-20
lines changed

2 files changed

+23
-20
lines changed

compiler/rustc_middle/src/traits/solve.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use rustc_macros::{HashStable, TypeFoldable, TypeVisitable};
44
use rustc_type_ir as ir;
55
pub use rustc_type_ir::solve::*;
66

7-
use crate::infer::canonical::QueryRegionConstraints;
87
use crate::ty::{
98
self, FallibleTypeFolder, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeVisitable, TypeVisitor,
109
};
@@ -52,7 +51,7 @@ impl<'tcx> std::ops::Deref for ExternalConstraints<'tcx> {
5251
#[derive(Debug, PartialEq, Eq, Clone, Hash, HashStable, Default, TypeVisitable, TypeFoldable)]
5352
pub struct ExternalConstraintsData<'tcx> {
5453
// FIXME: implement this.
55-
pub region_constraints: QueryRegionConstraints<'tcx>,
54+
pub region_constraints: Vec<ty::OutlivesPredicate<'tcx, ty::GenericArg<'tcx>>>,
5655
pub opaque_types: Vec<(ty::OpaqueTypeKey<'tcx>, Ty<'tcx>)>,
5756
pub normalization_nested_goals: NestedNormalizationGoals<'tcx>,
5857
}

compiler/rustc_trait_selection/src/solve/eval_ctxt/canonical.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,7 @@ impl<'tcx> EvalCtxt<'_, InferCtxt<'tcx>> {
135135
// Remove any trivial region constraints once we've resolved regions
136136
external_constraints
137137
.region_constraints
138-
.outlives
139-
.retain(|(outlives, _)| outlives.0.as_region().map_or(true, |re| re != outlives.1));
138+
.retain(|outlives| outlives.0.as_region().map_or(true, |re| re != outlives.1));
140139

141140
let canonical = Canonicalizer::canonicalize(
142141
self.infcx,
@@ -193,19 +192,23 @@ impl<'tcx> EvalCtxt<'_, InferCtxt<'tcx>> {
193192
// Cannot use `take_registered_region_obligations` as we may compute the response
194193
// inside of a `probe` whenever we have multiple choices inside of the solver.
195194
let region_obligations = self.infcx.inner.borrow().region_obligations().to_owned();
196-
let mut region_constraints = self.infcx.with_region_constraints(|region_constraints| {
197-
make_query_region_constraints(
198-
self.interner(),
199-
region_obligations.iter().map(|r_o| {
200-
(r_o.sup_type, r_o.sub_region, r_o.origin.to_constraint_category())
201-
}),
202-
region_constraints,
203-
)
204-
});
205-
195+
let QueryRegionConstraints { outlives, member_constraints } =
196+
self.infcx.with_region_constraints(|region_constraints| {
197+
make_query_region_constraints(
198+
self.interner(),
199+
region_obligations.iter().map(|r_o| {
200+
(r_o.sup_type, r_o.sub_region, r_o.origin.to_constraint_category())
201+
}),
202+
region_constraints,
203+
)
204+
});
205+
assert_eq!(member_constraints, vec![]);
206206
let mut seen = FxHashSet::default();
207-
region_constraints.outlives.retain(|outlives| seen.insert(*outlives));
208-
region_constraints
207+
outlives
208+
.into_iter()
209+
.filter(|(outlives, _)| seen.insert(*outlives))
210+
.map(|(outlives, _origin)| outlives)
211+
.collect()
209212
} else {
210213
Default::default()
211214
};
@@ -369,16 +372,17 @@ impl<'tcx> EvalCtxt<'_, InferCtxt<'tcx>> {
369372
}
370373
}
371374

372-
fn register_region_constraints(&mut self, region_constraints: &QueryRegionConstraints<'tcx>) {
373-
for &(ty::OutlivesPredicate(lhs, rhs), _) in &region_constraints.outlives {
375+
fn register_region_constraints(
376+
&mut self,
377+
outlives: &[ty::OutlivesPredicate<'tcx, ty::GenericArg<'tcx>>],
378+
) {
379+
for &ty::OutlivesPredicate(lhs, rhs) in outlives {
374380
match lhs.unpack() {
375381
GenericArgKind::Lifetime(lhs) => self.register_region_outlives(lhs, rhs),
376382
GenericArgKind::Type(lhs) => self.register_ty_outlives(lhs, rhs),
377383
GenericArgKind::Const(_) => bug!("const outlives: {lhs:?}: {rhs:?}"),
378384
}
379385
}
380-
381-
assert!(region_constraints.member_constraints.is_empty());
382386
}
383387

384388
fn register_new_opaque_types(&mut self, opaque_types: &[(ty::OpaqueTypeKey<'tcx>, Ty<'tcx>)]) {

0 commit comments

Comments
 (0)