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]>
