diff --git a/lang/attribute/account/src/lib.rs b/lang/attribute/account/src/lib.rs index da1dd8bd..4ea13811 100644 --- a/lang/attribute/account/src/lib.rs +++ b/lang/attribute/account/src/lib.rs @@ -291,9 +291,21 @@ pub fn zero_copy( ) -> proc_macro::TokenStream { let account_strct = parse_macro_input!(item as syn::ItemStruct); + // Takes the first repr. It's assumed that more than one are not on the + // struct. + let attr = account_strct + .attrs + .iter() + .find(|attr| anchor_syn::parser::tts_to_string(&attr.path) == "repr"); + + let repr = match attr { + Some(_attr) => quote! {}, + None => quote! {#[repr(C)]}, + }; + proc_macro::TokenStream::from(quote! { #[derive(anchor_lang::__private::ZeroCopyAccessor, Copy, Clone)] - #[repr(C)] + #repr #account_strct }) } diff --git a/tests/zero-copy/programs/zero-copy/src/lib.rs b/tests/zero-copy/programs/zero-copy/src/lib.rs index d029d521..05927688 100644 --- a/tests/zero-copy/programs/zero-copy/src/lib.rs +++ b/tests/zero-copy/programs/zero-copy/src/lib.rs @@ -139,6 +139,7 @@ pub struct UpdateLargeAccount<'info> { #[account(zero_copy)] #[derive(Default)] +#[repr(packed)] pub struct Foo { pub authority: Pubkey, pub data: u64,