Only check predicates for late-bound non-lifetime vars in object candidate assembly

This commit is contained in:
Michael Goulet 2023-11-05 13:36:00 +00:00
parent fb61292105
commit 24e14dd8b4
2 changed files with 23 additions and 1 deletions

View File

@ -628,7 +628,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
}
self.infcx.probe(|_snapshot| {
if obligation.has_non_region_late_bound() {
// FIXME(non_lifetime_binders): Really, we care only to check that we don't
// have any non-region *escaping* bound vars, but that's hard to check and
// we shouldn't really ever encounter those anyways.
if obligation.self_ty().has_non_region_late_bound() {
return;
}

View File

@ -0,0 +1,19 @@
// check-pass
trait Foo {
type Bar<T>
where
dyn Send + 'static: Send;
}
impl Foo for () {
type Bar<T> = i32;
// We take `<() as Foo>::Bar<T>: Sized` and normalize it under the where clause
// of `for<S> <() as Foo>::Bar<S> = i32`. This gives us back `i32: Send` with
// the nested obligation `(dyn Send + 'static): Send`. However, during candidate
// assembly for object types, we disqualify any obligations that has non-region
// late-bound vars in the param env(!), rather than just the predicate. This causes
// the where clause to not hold even though it trivially should.
}
fn main() {}