From d7e72b33d1091049ca8d08b36453e91f3b46f0c6 Mon Sep 17 00:00:00 2001 From: Armani Ferrante Date: Sun, 9 Jan 2022 16:19:41 -0500 Subject: [PATCH] lang: repr override for zero copy (#1273) --- lang/attribute/account/src/lib.rs | 14 +++++++++++++- tests/zero-copy/programs/zero-copy/src/lib.rs | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) 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,