diff --git a/crates/bevy_derive/src/derefs.rs b/crates/bevy_derive/src/derefs.rs index 0e3dfc1bf0f75..90b00f7b71c33 100644 --- a/crates/bevy_derive/src/derefs.rs +++ b/crates/bevy_derive/src/derefs.rs @@ -68,10 +68,12 @@ fn get_deref_field(ast: &DeriveInput, is_mut: bool) -> syn::Result<(Member, &Typ let mut selected_field: Option<(Member, &Type)> = None; for (index, field) in data_struct.fields.iter().enumerate() { for attr in &field.attrs { - if !attr.meta.require_path_only()?.is_ident(DEREF_ATTR) { + if !attr.meta.path().is_ident(DEREF_ATTR) { continue; } + attr.meta.require_path_only()?; + if selected_field.is_some() { return Err(syn::Error::new_spanned( attr, diff --git a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs index 2244e89b78385..96662054f266c 100644 --- a/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs +++ b/crates/bevy_macros_compile_fail_tests/tests/deref_derive/multiple_fields.pass.rs @@ -5,9 +5,13 @@ struct TupleStruct(usize, #[deref] String); #[derive(Deref)] struct Struct { + // Works with other attributes + #[cfg(test)] foo: usize, #[deref] bar: String, + /// Also works with doc comments. + baz: i32, } fn main() { @@ -15,8 +19,10 @@ fn main() { let _: &String = &*value; let value = Struct { + #[cfg(test)] foo: 123, bar: "Hello world!".to_string(), + baz: 321, }; let _: &String = &*value; }