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
> 

Reply via email to