RS.CLIPPY.EMPTY_ENUM
Enum with no variants
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. -
If the enum has no variants only because all variants happen to be disabled by conditional compilation, then it would be appropriate to allow the lint, with
#[allow(empty_enum)].
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 !);