Clippy lints / Nursery
Clippy lint · Nursery · checked with Clippy 0.1.99
clippy::empty_enums: Checks for enums with no variants, which therefore are uninhabited types (cannot be instantiated). As of this writing, the never_type is still a nightly-only experimental API. Therefore, this lint is only triggered if #![feature(never_type)] is enabled
What it meansChecks for enums with no variants, which therefore are uninhabited types (cannot be instantiated). As of this writing, the never_type is still a nightly-only experimental API. Therefore, this lint is only triggered if #![feature(never_type)] is enabled. It is in the nursery group and off by default.
Does it matter?
If you only want a type which can’t be instantiated, you should use ! (the primitive type “never”), because ! has more extensive compiler support (type inference, etc.) and implementations of common traits. If you need to introduce a distinct type, consider using a newtype struct containing ! instead (struct MyType(pub !)), because it is more idiomatic to use a struct rather than an enum when an enum is unnecessary. If you do this, note that the visibility of the ! field determines whether the uninhabitedness is visible in documentation, and whether it can be pattern matched to mark code unreachable. If the field is not visible, then the struct acts like any other struct with private fields. For further information, visit the never type’s documentation.
New lints still being finished. Off by default and may have false positives.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
enum CannotExist {}
Write this instead
#![feature(never_type)]
/// Use the `!` type directly...
type CannotExist = !;
/// ...or define a newtype which is distinct.
struct CannotExist2(pub !);
Turn it off, or on
It is off by default. To use it, set it to warn or deny:
Whole crate (Cargo.toml)
[lints.clippy]
empty_enums = "warn"In code
#![warn(clippy::empty_enums)]One run
cargo clippy -- -W clippy::empty-enumsThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for enums with no variants, which therefore are uninhabited types
(cannot be instantiated).
As of this writing, the never_type is still a nightly-only experimental API.
Therefore, this lint is only triggered if #![feature(never_type)] is enabled.
Why is this bad?
-
If you only want a type which can’t be instantiated, you should use
!(the primitive type “never”), because!has more extensive compiler support (type inference, etc.) and implementations of common traits. -
If you need to introduce a distinct type, consider using a newtype
structcontaining!instead (struct MyType(pub !)), because it is more idiomatic to use astructrather than anenumwhen anenumis unnecessary.If you do this, note that the visibility of the
!field determines whether the uninhabitedness is visible in documentation, and whether it can be pattern matched to mark code unreachable. If the field is not visible, then the struct acts like any other struct with private fields.
For further information, visit the never type’s documentation.
Example
enum CannotExist {}
Use instead:
#![feature(never_type)]
/// Use the `!` type directly...
type CannotExist = !;
/// ...or define a newtype which is distinct.
struct CannotExist2(pub !);
Past names
- empty_enum
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- redundant_cloneChecks for a redundant clone() (and its relatives) which clones an owned value that is going to be dropped without further use
- debug_assert_with_mut_callChecks for function/method calls with a mutable parameter in debug_assert!, debug_assert_eq! and debug_assert_ne! macros
- derive_partial_eq_without_eqChecks for types that derive PartialEq and could implement Eq
- doc_link_codecode link adjacent to code text
- equatable_if_letChecks for pattern matchings that can be expressed using equality
- fallible_impl_fromconsider implementing `TryFrom` instead
- future_not_sendfuture cannot be sent between threads safely
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::redundant_cloneChecks for a redundant clone() (and its relatives) which clones an owned value that is going to be dropped without further useRead it next →Did this answer your question?