1
Fork 0

Auto merge of #76893 - lcnr:existential-proj, r=estebank

Improve `skip_binder` usage during FlagComputation

It looks like there was previously a bug around `ExistentialPredicate::Projection` here, don't know how to best trigger that one to add a regression test though.
This commit is contained in:
bors 2020-10-20 08:59:12 +00:00
commit 9832374f6e
2 changed files with 33 additions and 37 deletions

View file

@ -134,7 +134,7 @@ impl<'tcx> CtxtInterners<'tcx> {
fn intern_predicate(&self, kind: PredicateKind<'tcx>) -> &'tcx PredicateInner<'tcx> { fn intern_predicate(&self, kind: PredicateKind<'tcx>) -> &'tcx PredicateInner<'tcx> {
self.predicate self.predicate
.intern(kind, |kind| { .intern(kind, |kind| {
let flags = super::flags::FlagComputation::for_predicate(&kind); let flags = super::flags::FlagComputation::for_predicate(kind);
let predicate_struct = PredicateInner { let predicate_struct = PredicateInner {
kind, kind,

View file

@ -22,7 +22,7 @@ impl FlagComputation {
result result
} }
pub fn for_predicate(kind: &ty::PredicateKind<'_>) -> FlagComputation { pub fn for_predicate(kind: ty::PredicateKind<'_>) -> FlagComputation {
let mut result = FlagComputation::new(); let mut result = FlagComputation::new();
result.add_predicate_kind(kind); result.add_predicate_kind(kind);
result result
@ -53,7 +53,14 @@ impl FlagComputation {
/// Adds the flags/depth from a set of types that appear within the current type, but within a /// Adds the flags/depth from a set of types that appear within the current type, but within a
/// region binder. /// region binder.
fn add_bound_computation(&mut self, computation: FlagComputation) { fn bound_computation<T, F>(&mut self, value: ty::Binder<T>, f: F)
where
F: FnOnce(&mut Self, T),
{
let mut computation = FlagComputation::new();
f(&mut computation, value.skip_binder());
self.add_flags(computation.flags); self.add_flags(computation.flags);
// The types that contributed to `computation` occurred within // The types that contributed to `computation` occurred within
@ -101,9 +108,7 @@ impl FlagComputation {
} }
&ty::GeneratorWitness(ts) => { &ty::GeneratorWitness(ts) => {
let mut computation = FlagComputation::new(); self.bound_computation(ts, |flags, ts| flags.add_tys(ts));
computation.add_tys(ts.skip_binder());
self.add_bound_computation(computation);
} }
&ty::Closure(_, substs) => { &ty::Closure(_, substs) => {
@ -154,20 +159,21 @@ impl FlagComputation {
self.add_substs(substs); self.add_substs(substs);
} }
&ty::Dynamic(ref obj, r) => { &ty::Dynamic(obj, r) => {
let mut computation = FlagComputation::new(); self.bound_computation(obj, |computation, obj| {
for predicate in obj.skip_binder().iter() { for predicate in obj.iter() {
match predicate { match predicate {
ty::ExistentialPredicate::Trait(tr) => computation.add_substs(tr.substs), ty::ExistentialPredicate::Trait(tr) => {
ty::ExistentialPredicate::Projection(p) => { computation.add_substs(tr.substs)
let mut proj_computation = FlagComputation::new(); }
proj_computation.add_existential_projection(&p); ty::ExistentialPredicate::Projection(p) => {
self.add_bound_computation(proj_computation); computation.add_existential_projection(&p);
}
ty::ExistentialPredicate::AutoTrait(_) => {}
} }
ty::ExistentialPredicate::AutoTrait(_) => {}
} }
} });
self.add_bound_computation(computation);
self.add_region(r); self.add_region(r);
} }
@ -195,22 +201,21 @@ impl FlagComputation {
self.add_substs(substs); self.add_substs(substs);
} }
&ty::FnPtr(f) => { &ty::FnPtr(fn_sig) => self.bound_computation(fn_sig, |computation, fn_sig| {
self.add_fn_sig(f); computation.add_tys(fn_sig.inputs());
} computation.add_ty(fn_sig.output());
}),
} }
} }
fn add_predicate_kind(&mut self, kind: &ty::PredicateKind<'_>) { fn add_predicate_kind(&mut self, kind: ty::PredicateKind<'_>) {
match kind { match kind {
ty::PredicateKind::ForAll(binder) => { ty::PredicateKind::ForAll(binder) => {
let mut computation = FlagComputation::new(); self.bound_computation(binder, |computation, atom| {
computation.add_predicate_atom(atom)
computation.add_predicate_atom(binder.skip_binder()); });
self.add_bound_computation(computation);
} }
&ty::PredicateKind::Atom(atom) => self.add_predicate_atom(atom), ty::PredicateKind::Atom(atom) => self.add_predicate_atom(atom),
} }
} }
@ -266,15 +271,6 @@ impl FlagComputation {
} }
} }
fn add_fn_sig(&mut self, fn_sig: ty::PolyFnSig<'_>) {
let mut computation = FlagComputation::new();
computation.add_tys(fn_sig.skip_binder().inputs());
computation.add_ty(fn_sig.skip_binder().output());
self.add_bound_computation(computation);
}
fn add_region(&mut self, r: ty::Region<'_>) { fn add_region(&mut self, r: ty::Region<'_>) {
self.add_flags(r.type_flags()); self.add_flags(r.type_flags());
if let ty::ReLateBound(debruijn, _) = *r { if let ty::ReLateBound(debruijn, _) = *r {