From e42c97919cd5a7fe856865cfd1034dfe14206ceb Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Sat, 15 Aug 2020 12:29:23 +0100 Subject: [PATCH] Don't require lifetime super-bounds on traits apply to trait objects of that trait --- .../src/traits/select/confirmation.rs | 31 ++++++++++--------- .../trait-object-supertrait-lifetime-bound.rs | 16 ++++++++++ 2 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 src/test/ui/traits/trait-object-supertrait-lifetime-bound.rs diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 8c58d4191c5af..7f9525c842a0c 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -439,26 +439,29 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let upcast_trait_ref = upcast_trait_ref.unwrap(); - // Check supertraits hold + // Check supertraits hold. This is so that their associated type bounds + // will be checked in the code below. for super_trait in tcx .super_predicates_of(trait_predicate.def_id()) .instantiate(tcx, trait_predicate.trait_ref.substs) .predicates .into_iter() { - let normalized_super_trait = normalize_with_depth_to( - self, - obligation.param_env, - obligation.cause.clone(), - obligation.recursion_depth + 1, - &super_trait, - &mut nested, - ); - nested.push(Obligation::new( - obligation.cause.clone(), - obligation.param_env.clone(), - normalized_super_trait, - )); + if let ty::PredicateAtom::Trait(..) = super_trait.skip_binders() { + let normalized_super_trait = normalize_with_depth_to( + self, + obligation.param_env, + obligation.cause.clone(), + obligation.recursion_depth + 1, + &super_trait, + &mut nested, + ); + nested.push(Obligation::new( + obligation.cause.clone(), + obligation.param_env.clone(), + normalized_super_trait, + )); + } } let assoc_types: Vec<_> = tcx diff --git a/src/test/ui/traits/trait-object-supertrait-lifetime-bound.rs b/src/test/ui/traits/trait-object-supertrait-lifetime-bound.rs new file mode 100644 index 0000000000000..9d834727a4a1b --- /dev/null +++ b/src/test/ui/traits/trait-object-supertrait-lifetime-bound.rs @@ -0,0 +1,16 @@ +// check-pass + +use std::any::Any; + +trait A: Any { + fn m(&self) {} +} + +impl A for T {} + +fn call_obj<'a>() { + let obj: &dyn A<&'a ()> = &(); + obj.m(); +} + +fn main() {}