Make the Elaboratable trait take clauses

This commit is contained in:
Michael Goulet 2023-06-29 00:46:41 +00:00
parent eb76764ea4
commit aafc801d69

View File

@ -80,14 +80,14 @@ pub struct Elaborator<'tcx, O> {
pub trait Elaboratable<'tcx> { pub trait Elaboratable<'tcx> {
fn predicate(&self) -> ty::Predicate<'tcx>; fn predicate(&self) -> ty::Predicate<'tcx>;
// Makes a new `Self` but with a different predicate. // Makes a new `Self` but with a different clause that comes from elaboration.
fn child(&self, predicate: ty::Predicate<'tcx>) -> Self; fn child(&self, clause: ty::Clause<'tcx>) -> Self;
// Makes a new `Self` but with a different predicate and a different cause // Makes a new `Self` but with a different clause and a different cause
// code (if `Self` has one). // code (if `Self` has one, such as [`PredicateObligation`]).
fn child_with_derived_cause( fn child_with_derived_cause(
&self, &self,
predicate: ty::Predicate<'tcx>, clause: ty::Clause<'tcx>,
span: Span, span: Span,
parent_trait_pred: ty::PolyTraitPredicate<'tcx>, parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
index: usize, index: usize,
@ -99,18 +99,18 @@ impl<'tcx> Elaboratable<'tcx> for PredicateObligation<'tcx> {
self.predicate self.predicate
} }
fn child(&self, predicate: ty::Predicate<'tcx>) -> Self { fn child(&self, clause: ty::Clause<'tcx>) -> Self {
Obligation { Obligation {
cause: self.cause.clone(), cause: self.cause.clone(),
param_env: self.param_env, param_env: self.param_env,
recursion_depth: 0, recursion_depth: 0,
predicate, predicate: clause.as_predicate(),
} }
} }
fn child_with_derived_cause( fn child_with_derived_cause(
&self, &self,
predicate: ty::Predicate<'tcx>, clause: ty::Clause<'tcx>,
span: Span, span: Span,
parent_trait_pred: ty::PolyTraitPredicate<'tcx>, parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
index: usize, index: usize,
@ -123,7 +123,12 @@ impl<'tcx> Elaboratable<'tcx> for PredicateObligation<'tcx> {
span, span,
})) }))
}); });
Obligation { cause, param_env: self.param_env, recursion_depth: 0, predicate } Obligation {
cause,
param_env: self.param_env,
recursion_depth: 0,
predicate: clause.as_predicate(),
}
} }
} }
@ -132,18 +137,18 @@ impl<'tcx> Elaboratable<'tcx> for ty::Predicate<'tcx> {
*self *self
} }
fn child(&self, predicate: ty::Predicate<'tcx>) -> Self { fn child(&self, clause: ty::Clause<'tcx>) -> Self {
predicate clause.as_predicate()
} }
fn child_with_derived_cause( fn child_with_derived_cause(
&self, &self,
predicate: ty::Predicate<'tcx>, clause: ty::Clause<'tcx>,
_span: Span, _span: Span,
_parent_trait_pred: ty::PolyTraitPredicate<'tcx>, _parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
_index: usize, _index: usize,
) -> Self { ) -> Self {
predicate clause.as_predicate()
} }
} }
@ -152,18 +157,18 @@ impl<'tcx> Elaboratable<'tcx> for (ty::Predicate<'tcx>, Span) {
self.0 self.0
} }
fn child(&self, predicate: ty::Predicate<'tcx>) -> Self { fn child(&self, clause: ty::Clause<'tcx>) -> Self {
(predicate, self.1) (clause.as_predicate(), self.1)
} }
fn child_with_derived_cause( fn child_with_derived_cause(
&self, &self,
predicate: ty::Predicate<'tcx>, clause: ty::Clause<'tcx>,
_span: Span, _span: Span,
_parent_trait_pred: ty::PolyTraitPredicate<'tcx>, _parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
_index: usize, _index: usize,
) -> Self { ) -> Self {
(predicate, self.1) (clause.as_predicate(), self.1)
} }
} }
@ -172,18 +177,18 @@ impl<'tcx> Elaboratable<'tcx> for (ty::Clause<'tcx>, Span) {
self.0.as_predicate() self.0.as_predicate()
} }
fn child(&self, predicate: ty::Predicate<'tcx>) -> Self { fn child(&self, clause: ty::Clause<'tcx>) -> Self {
(predicate.expect_clause(), self.1) (clause, self.1)
} }
fn child_with_derived_cause( fn child_with_derived_cause(
&self, &self,
predicate: ty::Predicate<'tcx>, clause: ty::Clause<'tcx>,
_span: Span, _span: Span,
_parent_trait_pred: ty::PolyTraitPredicate<'tcx>, _parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
_index: usize, _index: usize,
) -> Self { ) -> Self {
(predicate.expect_clause(), self.1) (clause, self.1)
} }
} }
@ -192,18 +197,18 @@ impl<'tcx> Elaboratable<'tcx> for ty::Clause<'tcx> {
self.as_predicate() self.as_predicate()
} }
fn child(&self, predicate: ty::Predicate<'tcx>) -> Self { fn child(&self, clause: ty::Clause<'tcx>) -> Self {
predicate.expect_clause() clause
} }
fn child_with_derived_cause( fn child_with_derived_cause(
&self, &self,
predicate: ty::Predicate<'tcx>, clause: ty::Clause<'tcx>,
_span: Span, _span: Span,
_parent_trait_pred: ty::PolyTraitPredicate<'tcx>, _parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
_index: usize, _index: usize,
) -> Self { ) -> Self {
predicate.expect_clause() clause
} }
} }
@ -252,14 +257,13 @@ impl<'tcx, O: Elaboratable<'tcx>> Elaborator<'tcx, O> {
}; };
let obligations = let obligations =
predicates.predicates.iter().enumerate().map(|(index, &(mut pred, span))| { predicates.predicates.iter().enumerate().map(|(index, &(mut clause, span))| {
// when parent predicate is non-const, elaborate it to non-const predicates. // when parent predicate is non-const, elaborate it to non-const predicates.
if data.constness == ty::BoundConstness::NotConst { if data.constness == ty::BoundConstness::NotConst {
pred = pred.without_const(tcx); clause = clause.without_const(tcx);
} }
elaboratable.child_with_derived_cause( elaboratable.child_with_derived_cause(
pred.subst_supertrait(tcx, &bound_predicate.rebind(data.trait_ref)) clause.subst_supertrait(tcx, &bound_predicate.rebind(data.trait_ref)),
.as_predicate(),
span, span,
bound_predicate.rebind(data), bound_predicate.rebind(data),
index, index,
@ -333,17 +337,15 @@ impl<'tcx, O: Elaboratable<'tcx>> Elaborator<'tcx, O> {
if r.is_late_bound() { if r.is_late_bound() {
None None
} else { } else {
Some(ty::PredicateKind::Clause(ty::ClauseKind::RegionOutlives( Some(ty::ClauseKind::RegionOutlives(ty::OutlivesPredicate(
ty::OutlivesPredicate(r, r_min), r, r_min,
))) )))
} }
} }
Component::Param(p) => { Component::Param(p) => {
let ty = tcx.mk_ty_param(p.index, p.name); let ty = tcx.mk_ty_param(p.index, p.name);
Some(ty::PredicateKind::Clause(ty::ClauseKind::TypeOutlives( Some(ty::ClauseKind::TypeOutlives(ty::OutlivesPredicate(ty, r_min)))
ty::OutlivesPredicate(ty, r_min),
)))
} }
Component::UnresolvedInferenceVariable(_) => None, Component::UnresolvedInferenceVariable(_) => None,
@ -351,8 +353,9 @@ impl<'tcx, O: Elaboratable<'tcx>> Elaborator<'tcx, O> {
Component::Alias(alias_ty) => { Component::Alias(alias_ty) => {
// We might end up here if we have `Foo<<Bar as Baz>::Assoc>: 'a`. // We might end up here if we have `Foo<<Bar as Baz>::Assoc>: 'a`.
// With this, we can deduce that `<Bar as Baz>::Assoc: 'a`. // With this, we can deduce that `<Bar as Baz>::Assoc: 'a`.
Some(ty::PredicateKind::Clause(ty::ClauseKind::TypeOutlives( Some(ty::ClauseKind::TypeOutlives(ty::OutlivesPredicate(
ty::OutlivesPredicate(alias_ty.to_ty(tcx), r_min), alias_ty.to_ty(tcx),
r_min,
))) )))
} }
@ -362,10 +365,9 @@ impl<'tcx, O: Elaboratable<'tcx>> Elaborator<'tcx, O> {
None None
} }
}) })
.map(|predicate_kind| { .map(|clause| {
bound_predicate.rebind(predicate_kind).to_predicate(tcx) elaboratable.child(bound_predicate.rebind(clause).to_predicate(tcx))
}) }),
.map(|predicate| elaboratable.child(predicate)),
); );
} }
ty::PredicateKind::Clause(ty::ClauseKind::TypeWellFormedFromEnv(..)) => { ty::PredicateKind::Clause(ty::ClauseKind::TypeWellFormedFromEnv(..)) => {