Skip to content

Commit

Permalink
handle trait objects formed from traits with Self::Foo: 'a clauses
Browse files Browse the repository at this point in the history
  • Loading branch information
nikomatsakis committed Nov 16, 2018
1 parent 0d744ec commit 6575988
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
21 changes: 16 additions & 5 deletions src/librustc_typeck/outlives/implicit_infer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ use rustc::hir::def_id::DefId;
use rustc::hir::itemlikevisit::ItemLikeVisitor;
use rustc::ty::subst::{Kind, Subst, UnpackedKind};
use rustc::ty::{self, Ty, TyCtxt};
use rustc::ty::fold::TypeFoldable;
use rustc::util::nodemap::FxHashMap;

use super::explicit::ExplicitPredicatesMap;
Expand Down Expand Up @@ -311,13 +312,23 @@ pub fn check_explicit_predicates<'tcx>(
//
// Note that we do this check for self **before** applying `substs`. In the
// case that `substs` come from a `dyn Trait` type, our caller will have
// included `Self = dyn Trait<'x, X>` as the value for `Self`. If we were
// included `Self = usize` as the value for `Self`. If we were
// to apply the substs, and not filter this predicate, we might then falsely
// conclude that e.g. `X: 'x` was a reasonable inferred requirement.
if let UnpackedKind::Type(ty) = outlives_predicate.0.unpack() {
if ty.is_self() && ignore_self_ty.0 {
debug!("skipping self ty = {:?}", &ty);
continue;
//
// Another similar case is where we have a inferred
// requirement like `<Self as Trait>::Foo: 'b`. We presently
// ignore such requirements as well (cc #54467)-- though
// conceivably it might be better if we could extract the `Foo
// = X` binding from the object type (there must be such a
// binding) and thus infer an outlives requirement that `X:
// 'b`.
if ignore_self_ty.0 {
if let UnpackedKind::Type(ty) = outlives_predicate.0.unpack() {
if ty.has_self_ty() {
debug!("skipping self ty = {:?}", &ty);
continue;
}
}
}

Expand Down
17 changes: 17 additions & 0 deletions src/test/ui/rfc-2093-infer-outlives/issue-54467.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Regression test for #54467:
//
// Here, the trait object has an "inferred outlives" requirement that
// `<Self as MyIterator<'a>>::Item: 'a`; but since we don't know what
// `Self` is, we were (incorrectly) messing things up, leading to
// strange errors. This test ensures that we do not give compilation
// errors.
//
// compile-pass

trait MyIterator<'a>: Iterator where Self::Item: 'a { }

struct MyStruct<'a, A> {
item: Box<dyn MyIterator<'a, Item = A>>
}

fn main() { }

0 comments on commit 6575988

Please sign in to comment.