--- /dev/null
+trait Wrap<'b> {
+ fn foo(&'b mut self);
+}
+
+struct Wrapper<P>(P);
+
+impl<'b, P> Wrap<'b> for Wrapper<P>
+where P: Process<'b>,
+ <P as Process<'b>>::Item: Iterator {
+ fn foo(&mut self) {}
+}
+
+
+pub trait Process<'a> {
+ type Item;
+ fn bar(&'a self);
+}
+
+fn push_process<P>(process: P) where P: Process<'static> {
+ let _: Box<for<'b> Wrap<'b>> = Box::new(Wrapper(process));
+}
+
+fn main() {}
--- /dev/null
+error[E0277]: the trait bound `for<'b> P: Process<'b>` is not satisfied
+ --> $DIR/issue-22872.rs:20:36
+ |
+LL | let _: Box<for<'b> Wrap<'b>> = Box::new(Wrapper(process));
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'b> Process<'b>` is not implemented for `P`
+ |
+ = help: consider adding a `where for<'b> P: Process<'b>` bound
+ = note: required because of the requirements on the impl of `for<'b> Wrap<'b>` for `Wrapper<P>`
+ = note: required for the cast to the object type `dyn for<'b> Wrap<'b>`
+
+error[E0277]: `<P as Process<'b>>::Item` is not an iterator
+ --> $DIR/issue-22872.rs:20:36
+ |
+LL | let _: Box<for<'b> Wrap<'b>> = Box::new(Wrapper(process));
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^ `<P as Process<'b>>::Item` is not an iterator
+ |
+ = help: the trait `for<'b> std::iter::Iterator` is not implemented for `<P as Process<'b>>::Item`
+ = note: required because of the requirements on the impl of `for<'b> Wrap<'b>` for `Wrapper<P>`
+ = note: required for the cast to the object type `dyn for<'b> Wrap<'b>`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0277`.