[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 4/5] rust: qom: make ParentInit lifetime-invariant
From: |
Zhao Liu |
Subject: |
Re: [PATCH 4/5] rust: qom: make ParentInit lifetime-invariant |
Date: |
Thu, 12 Jun 2025 17:41:58 +0800 |
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 <pbonzini@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.liu@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
>
- [PATCH 0/5] rust: make instance_init implementations use safe Rust, Paolo Bonzini, 2025/06/09
- [PATCH 2/5] rust: hpet: fully initialize object after instance_init, Paolo Bonzini, 2025/06/09
- [PATCH 1/5] rust: qemu_api: introduce MaybeUninit field projection, Paolo Bonzini, 2025/06/09
- [PATCH 3/5] rust: qom: introduce ParentInit, Paolo Bonzini, 2025/06/09
- [PATCH 4/5] rust: qom: make ParentInit lifetime-invariant, Paolo Bonzini, 2025/06/09
- Re: [PATCH 4/5] rust: qom: make ParentInit lifetime-invariant, Zhao Liu, 2025/06/12
[PATCH 5/5] rust: qom: change instance_init to take a ParentInit<>, Paolo Bonzini, 2025/06/09