From 1f3dafa564ac05146b0dc874ba0bb8eed3c97797 Mon Sep 17 00:00:00 2001 From: Alex Orlenko Date: Sat, 30 May 2026 12:46:31 +0100 Subject: [PATCH] mlua_derive: Reject static field functions with args --- mlua_derive/src/userdata/userdata_impl.rs | 8 ++++++++ tests/compile.rs | 1 + tests/compile/userdata_field_with_args.rs | 15 +++++++++++++++ tests/compile/userdata_field_with_args.stderr | 5 +++++ 4 files changed, 29 insertions(+) create mode 100644 tests/compile/userdata_field_with_args.rs create mode 100644 tests/compile/userdata_field_with_args.stderr diff --git a/mlua_derive/src/userdata/userdata_impl.rs b/mlua_derive/src/userdata/userdata_impl.rs index 4dbadc6..a63eede 100644 --- a/mlua_derive/src/userdata/userdata_impl.rs +++ b/mlua_derive/src/userdata/userdata_impl.rs @@ -335,6 +335,14 @@ pub fn userdata_impl(attr: TokenStream, item: TokenStream) -> TokenStream { .to_compile_error() .into(); } + if !info.args.is_empty() { + return syn::Error::new_spanned( + &method.sig, + "field function must not take arguments", + ) + .to_compile_error() + .into(); + } let lua_name = lua_attr.name(fn_name); if lua_attr.meta { let tokens = quote! { diff --git a/tests/compile.rs b/tests/compile.rs index 64d2fff..6bd8408 100644 --- a/tests/compile.rs +++ b/tests/compile.rs @@ -35,6 +35,7 @@ fn test_compilation() { t.compile_fail("tests/compile/userdata_static_with_self.rs"); t.compile_fail("tests/compile/userdata_meta_owned_self.rs"); t.compile_fail("tests/compile/userdata_const_getter.rs"); + t.compile_fail("tests/compile/userdata_field_with_args.rs"); } #[cfg(all(feature = "macros", feature = "async"))] diff --git a/tests/compile/userdata_field_with_args.rs b/tests/compile/userdata_field_with_args.rs new file mode 100644 index 0000000..5394eaf --- /dev/null +++ b/tests/compile/userdata_field_with_args.rs @@ -0,0 +1,15 @@ +#[derive(Default)] +#[mlua::userdata] +struct Foo { + x: u32, +} + +#[mlua::userdata_impl] +impl Foo { + #[lua(field)] + fn as_name(name: &str) -> String { + name.to_string() + } +} + +fn main() {} diff --git a/tests/compile/userdata_field_with_args.stderr b/tests/compile/userdata_field_with_args.stderr new file mode 100644 index 0000000..c7ccf45 --- /dev/null +++ b/tests/compile/userdata_field_with_args.stderr @@ -0,0 +1,5 @@ +error: field function must not take arguments + --> tests/compile/userdata_field_with_args.rs:10:5 + | +10 | fn as_name(name: &str) -> String { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^