diff --git a/CHANGELOG.md b/CHANGELOG.md index 668c83409a..91b160e605 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -118,6 +118,7 @@ The minor version will be incremented upon a breaking change and the patch versi - idl: Fix using `Pubkey` constants with `seeds::program` ([#3559](https://github.com/coral-xyz/anchor/pull/3559)). - lang: Fix instructions with no accounts causing compilation errors when using `declare_program!` ([#3567](https://github.com/coral-xyz/anchor/pull/3567)). - idl: Fix using account or arg values for `seeds::program` ([#3570](https://github.com/coral-xyz/anchor/pull/3570)). +- lang: Fix using `data` as an instruction parameter name in `declare_program!` ([#3574](https://github.com/coral-xyz/anchor/pull/3574)). ### Breaking diff --git a/lang/attribute/program/src/declare_program/mods/cpi.rs b/lang/attribute/program/src/declare_program/mods/cpi.rs index d5dfb4eb8a..a0570394c2 100644 --- a/lang/attribute/program/src/declare_program/mods/cpi.rs +++ b/lang/attribute/program/src/declare_program/mods/cpi.rs @@ -71,9 +71,10 @@ fn gen_cpi_instructions(idl: &Idl) -> proc_macro2::TokenStream { #(#args),* ) -> #ret_type { let ix = { + let ix = internal::args::#arg_value; let mut data = Vec::with_capacity(256); data.extend_from_slice(&#discriminator); - AnchorSerialize::serialize(&internal::args::#arg_value, &mut data) + AnchorSerialize::serialize(&ix, &mut data) .map_err(|_| anchor_lang::error::ErrorCode::InstructionDidNotSerialize)?; let accounts = ctx.to_account_metas(None); diff --git a/tests/declare-program/idls/external.json b/tests/declare-program/idls/external.json index c709fcfdfa..f587ac0b2d 100644 --- a/tests/declare-program/idls/external.json +++ b/tests/declare-program/idls/external.json @@ -44,6 +44,31 @@ ], "args": [] }, + { + "name": "test_compilation_data_as_parameter_name", + "discriminator": [ + 225, + 145, + 68, + 92, + 146, + 206, + 248, + 206 + ], + "accounts": [ + { + "name": "signer", + "signer": true + } + ], + "args": [ + { + "name": "data", + "type": "bytes" + } + ] + }, { "name": "test_compilation_defined_type_param", "discriminator": [ diff --git a/tests/declare-program/programs/external/src/lib.rs b/tests/declare-program/programs/external/src/lib.rs index f7a538a049..d13bdbda61 100644 --- a/tests/declare-program/programs/external/src/lib.rs +++ b/tests/declare-program/programs/external/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(unused_variables)] + use anchor_lang::prelude::*; declare_id!("Externa111111111111111111111111111111111111"); @@ -46,6 +48,14 @@ pub mod external { Ok(true) } + // Compilation test for whether `data` can be used as an instruction parameter name + pub fn test_compilation_data_as_parameter_name( + _ctx: Context, + data: Vec, + ) -> Result<()> { + Ok(()) + } + // Compilation test for an instruction with no accounts pub fn test_compilation_no_accounts(_ctx: Context) -> Result<()> { Ok(())