bevyengine/bevy · error · syn::Error

SettingsGroup cannot be derived for unions

Error message

SettingsGroup cannot be derived for unions

What it means

Compile error from derive_settings_group: the DeriveInput's data is a DataUnion. SettingsGroup codegen only handles structs (named, unnamed, or unit), so the match on input.data has no productive arm for unions and raises this shape guard.

Source

Thrown at crates/bevy_ecs/macros/src/lib.rs:721

    let key_name = match &input.data {
        Data::Struct(data) => match data.fields {
            Fields::Named(_) if override_key_name.is_some() => {
                return syn::Error::new(
                    Span::call_site(),
                    "The `key` attribute is not supported for structs with named fields",
                )
                .into_compile_error()
                .into();
            }
            Fields::Named(_) => None,
            Fields::Unnamed(_) | Fields::Unit => {
                override_key_name.or_else(|| Some(pascal_to_snake_case(&name.to_string())))
            }
        },
        Data::Enum(_) => override_key_name.or(Some(pascal_to_snake_case(&name.to_string()))),
        Data::Union(_) => {
            return syn::Error::new(
                Span::call_site(),
                "SettingsGroup cannot be derived for unions",
            )
            .into_compile_error()
            .into();
        }
    };

    let group_name = override_group_name.unwrap_or(pascal_to_snake_case(&name.to_string()));
    let key_name = key_name
        .map(|f| quote! { #FQOption::Some(#f) })
        .unwrap_or(quote! { #FQOption::None });
    let file_name = override_file
        .map(|f| quote! { #FQOption::Some(#f) })
        .unwrap_or(quote! { #FQOption::None });

    let expanded = quote! {
        impl #path::SettingsGroup for #name {

View on GitHub (pinned to 396ca72708)

Solutions

  1. Change the union into a struct; unions cannot represent a settings hierarchy
  2. Model the variants as separate settings-group structs and select at runtime
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/bevy_ecs/macros/src/lib.rs:721 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/68952769b58455f7. Report an issue: GitHub.