rust-lang/rust · error · syn::Error

expected an empty enum

Error message

expected an empty enum

What it means

Thrown by `expect_empty_enum` (enums.rs:159), called by both `#[function_enum]` and `#[base_name_enum]`, when the annotated enum already has variants. Both macros populate the enum themselves from the global operation list, so the source enum must be empty.

Solutions

  1. Declare the enum with no variants: `enum Func {}`.
  2. Remove any manually-added variants; the macro generates them.

Example fix

// before
#[function_enum(BaseName)]
enum Func {
    Foo,
}

// after
#[function_enum(BaseName)]
enum Func {}
Defensive patterns

Strategy: validation

Prevention

When it happens

Trigger: Annotating an enum that already declares variants, e.g. `enum Func { Foo, Bar }`.

Common situations: Adding a placeholder variant during development; merging an existing enum under the macro; misunderstanding that the macro generates the variants.

Related errors


AI-assisted analysis of rust-lang/rust@7088e4b63a (2026-08-10). Data as JSON: /api/errors/c31663e3bd83b9c4. Report an issue: GitHub.

Appendix: source

Thrown at library/compiler-builtins/crates/libm-macros/src/enums.rs:159

        #item

        impl #item_name {
            /// The stringified version of this base name.
            pub const fn as_str(self) -> &'static str {
                match self {
                    #( #as_str_arms ),*
                }
            }
        }
    };

    Ok(res)
}

/// Verify that an enum is empty, otherwise return an error
fn expect_empty_enum(item: &ItemEnum) -> syn::Result<()> {
    if !item.variants.is_empty() {
        Err(syn::Error::new(
            item.variants.span(),
            "expected an empty enum",
        ))
    } else {
        Ok(())
    }
}

View on GitHub (pinned to 7088e4b63a)