On Thu, Jun 12, 2025 at 11:07:51AM +0200, Paolo Bonzini wrote: > Date: Thu, 12 Jun 2025 11:07:51 +0200 > From: Paolo Bonzini <pbonz...@redhat.com> > Subject: Re: [PATCH 4/5] rust: qom: make ParentInit lifetime-invariant > > On Thu, Jun 12, 2025 at 11:00 AM Zhao Liu <zhao1....@intel.com> wrote: > > > +/// It's impossible to escape the `Jail`; `token1` cannot be moved out > > > of the > > > +/// closure: > > > +/// > > > +/// ```ignore > > > +/// let x = 42; > > > +/// let escape = Jail::with(&x, |token1| { > > > +/// println!("{}", token1.get()); > > > +/// token1 > > > > This line will fail to compile (the below comment "// fails to compile" > > seems > > to indicate that println! will fail): > > > > error: lifetime may not live long enough > > --> src/main.rs:22:9 > > | > > 20 | let escape = Jail::with(x, |token1| { > > | ------- return type of closure is > > Jail<'2, i32> > > | | > > | has type `Jail<'1, i32>` > > 21 | println!("{}", token1.get()); > > 22 | token1 > > | ^^^^^^ returning this value requires that `'1` must outlive > > `'2` > > Right, I put it there because '2 lives until the second println!. The > problem is not so much that it's returning token1, it's that the > println uses it.
Even after I comment out the last intln line, the compiler still complains about returning token1. It seems the compiler's checking is stricter. I tried at there: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=1a9232532250b4a275638b926d7e65e5 Thanks, Zhao > I can see that it's confusing, maybe: > > // Because "escape" is used after the closure has returned, the > // compiler cannot find a type for the "let escape" assignment. > > Paolo >