bevyengine/bevy · error

Cannot have multiple default variants

Error message

Cannot have multiple default variants

What it means

Compile error from derive_from_template: while scanning enum variants, more than one was marked #[default]. Template codegen needs a single unambiguous default variant to generate the Default/FromTemplate impls, and this guard fires when the count exceeds one.

Source

Thrown at crates/bevy_ecs/macros/src/template.rs:149

            for variant in &data_enum.variants {
                let result = match struct_impl(&variant.fields, &bevy_ecs, true) {
                    Ok(result) => result,
                    Err(err) => return err.into_compile_error().into(),
                };
                let StructImpl {
                    template_fields,
                    template_field_builds,
                    template_field_defaults,
                    template_field_clones,
                    ..
                } = result;

                let is_default = variant
                    .attrs
                    .iter()
                    .any(|a| a.path().is_ident(TEMPLATE_DEFAULT_ATTRIBUTE));
                if is_default && variant_default_ident.is_some() {
                    panic!("Cannot have multiple default variants");
                }
                let variant_ident = &variant.ident;
                let variant_name_lower = variant_ident.to_string().to_lowercase();
                let variant_default_name = format_ident!("default_{}", variant_name_lower);
                match &variant.fields {
                    Fields::Named(fields) => {
                        variant_definitions.push(quote! {
                            #variant_ident {
                                #(#template_fields,)*
                            }
                        });
                        let field_idents = fields.named.iter().map(|f| &f.ident);
                        variant_builds.push(quote! {
                            // TODO: proper assignments here
                            #template_ident::#variant_ident {
                                #(#field_idents,)*
                            } => {
                                #type_ident::#variant_ident {

View on GitHub (pinned to 396ca72708)

Solutions

  1. Keep only one #[default] variant per enum
  2. Pick the intended default and remove the attribute from the others
  3. Implement Default manually if multiple fallback variants are genuinely needed
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/bevy_ecs/macros/src/template.rs:149 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/64f0c82cd0276760. Report an issue: GitHub.