On Mon, Mar 17, 2025 at 3:52 PM Zhao Liu <zhao1....@intel.com> wrote: > > When specify an array field in vmstate_struct macro, there will be an > error: > > > local ambiguity when calling macro `vmstate_struct`: multiple parsing > > options: built-in NTs expr ('vmsd') or 1 other option. > > This is because "expr" can't recognize the "vmsd" field correctly, so > that it gets confused with the previous array field. > > To fix the above issue, use "ident" for "vmsd" field, and explicitly > refer to it in the macro.
I think this is not needed if the varray case is left as is, and other cases use .with_...() instead of arguments? Paolo > Signed-off-by: Zhao Liu <zhao1....@intel.com> > --- > rust/hw/char/pl011/src/device_class.rs | 2 +- > rust/qemu-api/src/vmstate.rs | 4 ++-- > 2 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/rust/hw/char/pl011/src/device_class.rs > b/rust/hw/char/pl011/src/device_class.rs > index 0b2076ddaa0f..e43a5d6cd063 100644 > --- a/rust/hw/char/pl011/src/device_class.rs > +++ b/rust/hw/char/pl011/src/device_class.rs > @@ -72,7 +72,7 @@ extern "C" fn pl011_post_load(opaque: *mut c_void, > version_id: c_int) -> c_int { > post_load: Some(pl011_post_load), > fields: vmstate_fields! { > vmstate_unused!(core::mem::size_of::<u32>()), > - vmstate_struct!(PL011State, regs, &VMSTATE_PL011_REGS, > BqlRefCell<PL011Registers>), > + vmstate_struct!(PL011State, regs, VMSTATE_PL011_REGS, > BqlRefCell<PL011Registers>), > }, > subsections: vmstate_subsections! { > VMSTATE_PL011_CLOCK > diff --git a/rust/qemu-api/src/vmstate.rs b/rust/qemu-api/src/vmstate.rs > index 94efbd8bb735..3f95d4825149 100644 > --- a/rust/qemu-api/src/vmstate.rs > +++ b/rust/qemu-api/src/vmstate.rs > @@ -435,7 +435,7 @@ macro_rules! vmstate_unused { > #[doc(alias = "VMSTATE_STRUCT")] > #[macro_export] > macro_rules! vmstate_struct { > - ($struct_name:ty, $field_name:ident $(, [0 .. $num:ident $(* > $factor:expr)?])?, $vmsd:expr, $type:ty $(,)?) => { > + ($struct_name:ty, $field_name:ident $(, [0 .. $num:ident $(* > $factor:expr)?])?, $vmsd:ident, $type:ty $(,)?) => { > $crate::bindings::VMStateField { > name: ::core::concat!(::core::stringify!($field_name), "\0") > .as_bytes() > @@ -447,7 +447,7 @@ macro_rules! vmstate_struct { > }, > size: ::core::mem::size_of::<$type>(), > flags: $crate::bindings::VMStateFlags::VMS_STRUCT, > - vmsd: $vmsd, > + vmsd: &$vmsd, > ..$crate::zeroable::Zeroable::ZERO $( > .with_varray_flag($crate::call_func_with_field!( > $crate::vmstate::vmstate_varray_flag, > -- > 2.34.1 >