bevyengine/bevy · error

{deref_kind} cannot be derived on field-less structs

Error message

{deref_kind} cannot be derived on field-less structs

What it means

Compile-time syn error from get_deref_field: the derive input for #[derive(Deref)]/#[derive(DerefMut)] is a struct with no fields, so there is no field to dereference to. The derive macro requires exactly one target field (named or tuple field) to implement Deref/DerefMut.

Source

Thrown at crates/bevy_derive/src/derefs.rs:58

        }
    };
    let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();

    TokenStream::from(quote! {
        impl #impl_generics ::core::ops::DerefMut for #ident #ty_generics #where_clause {
            fn deref_mut(&mut self) -> &mut Self::Target {
                &mut self.#field_member
            }
        }
    })
}

fn get_deref_field(ast: &DeriveInput, is_mut: bool) -> syn::Result<(Member, &Type)> {
    let deref_kind = if is_mut { DEREF_MUT } else { DEREF };
    let deref_attr_str = format!("`#[{DEREF_ATTR}]`");

    match &ast.data {
        Data::Struct(data_struct) if data_struct.fields.is_empty() => Err(syn::Error::new(
            Span::call_site().into(),
            format!("{deref_kind} cannot be derived on field-less structs"),
        )),
        Data::Struct(data_struct) if data_struct.fields.len() == 1 => {
            let field = data_struct.fields.iter().next().unwrap();
            let member = to_member(field, 0);
            Ok((member, &field.ty))
        }
        Data::Struct(data_struct) => {
            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.path().is_ident(DEREF_ATTR) {
                        continue;
                    }

                    attr.meta.require_path_only()?;

View on GitHub (pinned to 396ca72708)

Solutions

  1. Add a field to the struct for the deref target
  2. Remove the derive from field-less marker types
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/bevy_derive/src/derefs.rs:58 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of bevyengine/bevy@396ca72708 (2026-08-20). Data as JSON: /api/errors/718ed2cda6464baa. Report an issue: GitHub.