lifetime bound not satisfied for a lending iterator (using generic associated types) with for_each method (original) (raw)

I'm trying to write a streaming/lending iterator trait using the nightly generic_associated_types feature (i.e. in the vein outlined here), in particular with a for_each method:

#![feature(generic_associated_types)]

pub trait LendingIterator { type Item<'a> where Self: 'a; fn next(&mut self) -> Option<Self::Item<'_>>;

fn for_each<F>(mut self, mut f: F)
where
    Self: Sized,
    F: FnMut(Self::Item<'_>),
{
    while let Some(item) = self.next() {
        f(item)
    }
}

}

However, the lifetime bounds don't appear to be satisfied for calling the for_each method when Self contains non 'static lifetimes:

pub struct Mutator(T);

impl LendingIterator for Mutator { type Item<'a> where Self: 'a = &'a mut T; fn next(&mut self) -> Option<Self::Item<'_>> { Some(&mut self.0) } }

pub fn bar(m: Mutator) { m.for_each(|_: &mut T| {}); }

pub fn foo<'m>(m: Mutator<&'m i32>) { m.for_each(|_: &mut &'m i32| {}); }

   Compiling playground v0.0.1 (/playground)
error[E0311]: the parameter type `T` may not live long enough
  --> src/lib.rs:28:7
   |
27 | pub fn bar<T>(m: Mutator<T>) {
   |            - help: consider adding an explicit lifetime bound...: `T: 'a`
28 |     m.for_each(|_: &mut T| {});
   |       ^^^^^^^^ ...so that the type `Mutator<T>` will meet its required lifetime bounds

error[E0477]: the type `Mutator<&i32>` does not fulfill the required lifetime
  --> src/lib.rs:32:7
   |
32 |     m.for_each(|_: &mut &'m i32| {});
   |       ^^^^^^^^

For more information about this error, try `rustc --explain E0477`.
error: could not compile `playground` due to 2 previous errors

playground

I think I would expect 'a be constrained to not outlive Self rather than requiring Self outlive any particular 'a. I could be missing something though.

It appears to be triggered by the inclusion of the closure parameter with its impilcit HRTB
So potentially this issue is related to #88460

forum discussion

Meta

Version tested with on the playground:

Nightly channel
Build using the Nightly version: 1.59.0-nightly
(2021-12-07 0b6f079e4987ded15c13)