Browse Source

lang: repr override for zero copy (#1273)

Armani Ferrante 3 years ago
parent
commit
d7e72b33d1
2 changed files with 14 additions and 1 deletions
  1. 13 1
      lang/attribute/account/src/lib.rs
  2. 1 0
      tests/zero-copy/programs/zero-copy/src/lib.rs

+ 13 - 1
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
     })
 }

+ 1 - 0
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,