diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 8fd7664d57885..c3f3baf9d3d47 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -468,23 +468,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { .predicates .into_iter() { - if let ty::PredicateKind::Trait(..) | ty::PredicateKind::Projection(..) = - super_trait.kind().skip_binder() - { - 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, - normalized_super_trait, - )); - } + 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, + normalized_super_trait, + )); } let assoc_types: Vec<_> = tcx diff --git a/src/test/ui/traits/object/supertrait-lifetime-bound.nll.stderr b/src/test/ui/traits/object/supertrait-lifetime-bound.nll.stderr new file mode 100644 index 0000000000000..ed2f8624357bb --- /dev/null +++ b/src/test/ui/traits/object/supertrait-lifetime-bound.nll.stderr @@ -0,0 +1,11 @@ +error: lifetime may not live long enough + --> $DIR/supertrait-lifetime-bound.rs:10:5 + | +LL | fn test2<'a>() { + | -- lifetime `'a` defined here +... +LL | test1::, _>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static` + +error: aborting due to previous error + diff --git a/src/test/ui/traits/object/supertrait-lifetime-bound.rs b/src/test/ui/traits/object/supertrait-lifetime-bound.rs index 9d834727a4a1b..5349771693a2a 100644 --- a/src/test/ui/traits/object/supertrait-lifetime-bound.rs +++ b/src/test/ui/traits/object/supertrait-lifetime-bound.rs @@ -1,16 +1,14 @@ -// check-pass +trait Foo: 'static { } -use std::any::Any; +trait Bar: Foo { } -trait A: Any { - fn m(&self) {} -} - -impl A for T {} +fn test1, S>() { } -fn call_obj<'a>() { - let obj: &dyn A<&'a ()> = &(); - obj.m(); +fn test2<'a>() { + // Here: the type `dyn Bar<&'a u32>` references `'a`, + // and so it does not outlive `'static`. + test1::, _>(); + //~^ ERROR the type `(dyn Bar<&'a u32> + 'static)` does not fulfill the required lifetime } -fn main() {} +fn main() { } diff --git a/src/test/ui/traits/object/supertrait-lifetime-bound.stderr b/src/test/ui/traits/object/supertrait-lifetime-bound.stderr new file mode 100644 index 0000000000000..c3d7f8cd0c1cd --- /dev/null +++ b/src/test/ui/traits/object/supertrait-lifetime-bound.stderr @@ -0,0 +1,15 @@ +error[E0477]: the type `(dyn Bar<&'a u32> + 'static)` does not fulfill the required lifetime + --> $DIR/supertrait-lifetime-bound.rs:10:5 + | +LL | test1::, _>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: type must satisfy the static lifetime as required by this binding + --> $DIR/supertrait-lifetime-bound.rs:5:22 + | +LL | fn test1, S>() { } + | ^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0477`.