On Wed, Oct 01, 2025 at 09:52:04AM +0200, Paolo Bonzini wrote:
> Date: Wed,  1 Oct 2025 09:52:04 +0200
> From: Paolo Bonzini <[email protected]>
> Subject: [PATCH 05/11] rust: migration: extract vmstate_fields_ref
> X-Mailer: git-send-email 2.51.0
> 
> This is useful when building a VMState for generic structs, because you have
> to avoid nested statics.  Using vmstate_fields! will fail in the likely case
> where the _FIELDS static uses Self from an outer item, because that is
> forbidden.
> 
> The separate macros are needed because you cannot just do
> 
>                  .fields(vmstate_fields_ref! {
>                       vmstate_of!(PL011State, clock),
>                  })
> 
> The value returned by vmstate_fields_ref! is not promoted to static, which is
> unfortunate but intentional (https://github.com/rust-lang/rust/issues/60502):
> 
> error[E0716]: temporary value dropped while borrowed
>    --> rust/hw/char/pl011/libpl011.rlib.p/structured/device.rs:743:17
>     |
> 738 | /      VMStateDescriptionBuilder::<PL011State>::new()
> 739 | |          .name(c"pl011/clock")
> 740 | |          .version_id(1)
> 741 | |          .minimum_version_id(1)
> 742 | |          .needed(&PL011State::clock_needed)
> 743 | |          .fields(vmstate_fields_ref! {
>     | | _________________^
> 744 | ||              vmstate_of!(PL011State, clock),
> 745 | ||         })
>     | ||_________^- argument requires that borrow lasts for `'static`
>     |  |_________|
>     |            creates a temporary value which is freed while still in use
> 746 |            .build();
>     |                   - temporary value is freed at the end of this 
> statement
> 
> Thus it is necessary to use the "static", whether explicitly or hidden by
> vmstate_fields.
> 
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
>  rust/migration/src/vmstate.rs | 23 +++++++++++++++++------
>  1 file changed, 17 insertions(+), 6 deletions(-)

Reviewed-by: Zhao Liu <[email protected]>


Reply via email to