about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2022-01-31 19:11:23 -0800
committerMichael Goulet <michael@errs.io>2022-03-14 17:59:31 -0700
commit67ef11dc2a64153a381c7b58475a2b65214557af (patch)
treed1b1800eab40d5b1286a1ed155ce1bb6c0902c8f
parentf14a5fd7127af1e774b76deea5a749ced33b23a1 (diff)
downloadrust-67ef11dc2a64153a381c7b58475a2b65214557af.tar.gz
rust-67ef11dc2a64153a381c7b58475a2b65214557af.zip
check all dyn obligations, actually
-rw-r--r--compiler/rustc_trait_selection/src/traits/select/confirmation.rs30
-rw-r--r--src/test/ui/traits/object/supertrait-lifetime-bound.nll.stderr11
-rw-r--r--src/test/ui/traits/object/supertrait-lifetime-bound.rs20
-rw-r--r--src/test/ui/traits/object/supertrait-lifetime-bound.stderr15
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`.