diff options
| author | Michael Goulet <michael@errs.io> | 2022-01-31 19:11:23 -0800 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-03-14 17:59:31 -0700 |
| commit | 67ef11dc2a64153a381c7b58475a2b65214557af (patch) | |
| tree | d1b1800eab40d5b1286a1ed155ce1bb6c0902c8f | |
| parent | f14a5fd7127af1e774b76deea5a749ced33b23a1 (diff) | |
| download | rust-67ef11dc2a64153a381c7b58475a2b65214557af.tar.gz rust-67ef11dc2a64153a381c7b58475a2b65214557af.zip | |
check all dyn obligations, actually
4 files changed, 48 insertions, 28 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 8fd7664d578..c3f3baf9d3d 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 00000000000..ed2f8624357 --- /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::<dyn Bar<&'a u32>, _>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 9d834727a4a..5349771693a 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<T>: Foo { } -trait A<T>: Any { - fn m(&self) {} -} - -impl<S, T: 'static> A<S> for T {} +fn test1<T: ?Sized + Bar<S>, 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::<dyn Bar<&'a u32>, _>(); + //~^ 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 00000000000..c3d7f8cd0c1 --- /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::<dyn Bar<&'a u32>, _>(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: type must satisfy the static lifetime as required by this binding + --> $DIR/supertrait-lifetime-bound.rs:5:22 + | +LL | fn test1<T: ?Sized + Bar<S>, S>() { } + | ^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0477`. |
