GraphiteEditor/Graphite · error · syn::Error
Tried to derive a discriminant for non-enum
Error message
Tried to derive a discriminant for non-enum
What it means
The Discriminant derive (proc-macros/src/discriminant.rs, generating ToDiscriminant impls with #[sub_discriminant] support) rejects any DeriveInput whose data is not Data::Enum. On a struct or union it returns this spanned compile-time error before generating anything.
Source
Thrown at proc-macros/src/discriminant.rs:11
use crate::helpers::call_site_ident;
use proc_macro2::{Ident, Span, TokenStream};
use syn::spanned::Spanned;
use syn::{Attribute, Data, DeriveInput, Field, Fields, ItemEnum, MetaList};
pub fn derive_discriminant_impl(input_item: TokenStream) -> syn::Result<TokenStream> {
let input = syn::parse2::<DeriveInput>(input_item).unwrap();
let mut data = match input.data {
Data::Enum(data) => data,
_ => return Err(syn::Error::new(Span::call_site(), "Tried to derive a discriminant for non-enum")),
};
let mut is_sub_discriminant = vec![];
let mut attr_errs = vec![];
for var in &mut data.variants {
if var.attrs.iter().any(|a| a.path().is_ident("sub_discriminant")) {
match var.fields.len() {
1 => {
let Field { ty, .. } = var.fields.iter_mut().next().unwrap();
*ty = syn::parse_quote! {
<#ty as ToDiscriminant>::Discriminant
};
is_sub_discriminant.push(true);
}
n => unimplemented!("#[sub_discriminant] on variants with {n} fields is not supported (for now)"),
}
} else {View on GitHub (pinned to c507b35645)
Solutions
- Move the Discriminant derive onto an enum
- Restructure the type as an enum (optionally with single-field #[sub_discriminant] variants)
- Hand-implement ToDiscriminant if the struct must stay a struct
Example fix
// before
#[derive(Discriminant)]
struct MyStruct;
// after
#[derive(Discriminant)]
enum MyEnum {
A,
B,
} Defensive patterns
Strategy: validation
Prevention
- Discriminant is enum-only — verify the item is an enum before deriving
- When collapsing an enum into a struct, remove enum-only derives in the same change
- Compile right after derive edits to catch misplacement early
When it happens
Trigger: #[derive(Discriminant)] on a struct or union; routing the derive entry point at a non-enum item.
Common situations: Restructuring a discriminated enum into a struct during refactoring; applying the wrong derive from IDE completion to a struct type.
Related errors
- Tried to derive AsMessage for non-enum
- Failed to parse input type for #[implementation(...)]. Expec
- Expected `->` arrow after input type in #[implementations(..
- Failed to parse output type for #[implementation(...)]. Expe
- Failed to parse node_fn attributes: {e}
AI-assisted analysis of GraphiteEditor/Graphite@c507b35645 (2026-08-16).
Data as JSON: /api/errors/b96ea299a0478e8f.
Report an issue: GitHub.