Skip to content
TE114 · Type · error

Enum with numeric discriminants cannot be generic

An enum opted into numeric discriminants (a backing type, or an explicit `= n`) but is generic or has a payload-carrying variant. Discriminants only make sense for a flat, all-unit-variant enum.

Why this fires

An enum opts into numeric discriminants (it declares a backing type, e.g. enum E: u8 { ... }, or any variant has an explicit = n), but it is generic or has a variant that carries a payload. Numeric discriminants only make sense for a flat, all-unit-variant enum — there's no single integer that could represent Circle(float)'s payload.

enum Packet: u8 {
    Connect,
    Data(str),
    //   ^^^ error[TE114]: variant `Packet::Data` has a payload, so enum `Packet`
    //       cannot use numeric discriminants (only all-unit enums can)
}

Fix it

1. Drop the payload

enum Packet: u8 {
    Connect,
    Data,                    // ok — unit variant
}

2. Drop the backing type

If the payload is essential, don't opt into numeric discriminants — leave the enum untyped:

enum Packet {
    Connect,
    Data(str),               // ok — no backing type, no discriminant machinery
}

See also

  • TE115 — a discriminant value doesn't fit the backing type.
  • TE116 — duplicate discriminant value.
  • TE117@stable enum requires an explicit discriminant on every variant.
  • TE118 — discriminant must be an integer constant.
  • /docs/data-structures#enums — numeric enum discriminants.

See also

Search Zolo

9 results

en