Auto merge of #6617 - Manishearth:exhaustive_enums, r=camsteffen
New lint: exhaustive_enums, exhaustive_structs Fixes #6616 changelog: Added restriction lint: `exhaustive_enums`, `exhaustive_structs`
This commit is contained in:
commit
8d57cee9ca
6 changed files with 332 additions and 0 deletions
82
tests/ui/exhaustive_items.fixed
Normal file
82
tests/ui/exhaustive_items.fixed
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
// run-rustfix
|
||||
|
||||
#![deny(clippy::exhaustive_enums, clippy::exhaustive_structs)]
|
||||
#![allow(unused)]
|
||||
|
||||
fn main() {
|
||||
// nop
|
||||
}
|
||||
|
||||
pub mod enums {
|
||||
#[non_exhaustive]
|
||||
pub enum Exhaustive {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
/// Some docs
|
||||
#[repr(C)]
|
||||
#[non_exhaustive]
|
||||
pub enum ExhaustiveWithAttrs {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
// no warning, already non_exhaustive
|
||||
#[non_exhaustive]
|
||||
pub enum NonExhaustive {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
enum ExhaustivePrivate {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
#[non_exhaustive]
|
||||
enum NonExhaustivePrivate {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
}
|
||||
|
||||
pub mod structs {
|
||||
#[non_exhaustive]
|
||||
pub struct Exhaustive {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
|
||||
// no warning, already non_exhaustive
|
||||
#[non_exhaustive]
|
||||
pub struct NonExhaustive {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
struct ExhaustivePrivate {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
#[non_exhaustive]
|
||||
struct NonExhaustivePrivate {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
}
|
||||
79
tests/ui/exhaustive_items.rs
Normal file
79
tests/ui/exhaustive_items.rs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
// run-rustfix
|
||||
|
||||
#![deny(clippy::exhaustive_enums, clippy::exhaustive_structs)]
|
||||
#![allow(unused)]
|
||||
|
||||
fn main() {
|
||||
// nop
|
||||
}
|
||||
|
||||
pub mod enums {
|
||||
pub enum Exhaustive {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
/// Some docs
|
||||
#[repr(C)]
|
||||
pub enum ExhaustiveWithAttrs {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
// no warning, already non_exhaustive
|
||||
#[non_exhaustive]
|
||||
pub enum NonExhaustive {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
enum ExhaustivePrivate {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
#[non_exhaustive]
|
||||
enum NonExhaustivePrivate {
|
||||
Foo,
|
||||
Bar,
|
||||
Baz,
|
||||
Quux(String),
|
||||
}
|
||||
}
|
||||
|
||||
pub mod structs {
|
||||
pub struct Exhaustive {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
|
||||
// no warning, already non_exhaustive
|
||||
#[non_exhaustive]
|
||||
pub struct NonExhaustive {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
struct ExhaustivePrivate {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
|
||||
// no warning, private
|
||||
#[non_exhaustive]
|
||||
struct NonExhaustivePrivate {
|
||||
foo: u8,
|
||||
bar: String,
|
||||
}
|
||||
}
|
||||
61
tests/ui/exhaustive_items.stderr
Normal file
61
tests/ui/exhaustive_items.stderr
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
error: exported enums should not be exhaustive
|
||||
--> $DIR/exhaustive_items.rs:11:5
|
||||
|
|
||||
LL | / pub enum Exhaustive {
|
||||
LL | | Foo,
|
||||
LL | | Bar,
|
||||
LL | | Baz,
|
||||
LL | | Quux(String),
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/exhaustive_items.rs:3:9
|
||||
|
|
||||
LL | #![deny(clippy::exhaustive_enums, clippy::exhaustive_structs)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: try adding #[non_exhaustive]
|
||||
|
|
||||
LL | #[non_exhaustive]
|
||||
LL | pub enum Exhaustive {
|
||||
|
|
||||
|
||||
error: exported enums should not be exhaustive
|
||||
--> $DIR/exhaustive_items.rs:20:5
|
||||
|
|
||||
LL | / pub enum ExhaustiveWithAttrs {
|
||||
LL | | Foo,
|
||||
LL | | Bar,
|
||||
LL | | Baz,
|
||||
LL | | Quux(String),
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
help: try adding #[non_exhaustive]
|
||||
|
|
||||
LL | #[non_exhaustive]
|
||||
LL | pub enum ExhaustiveWithAttrs {
|
||||
|
|
||||
|
||||
error: exported structs should not be exhaustive
|
||||
--> $DIR/exhaustive_items.rs:55:5
|
||||
|
|
||||
LL | / pub struct Exhaustive {
|
||||
LL | | foo: u8,
|
||||
LL | | bar: String,
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/exhaustive_items.rs:3:35
|
||||
|
|
||||
LL | #![deny(clippy::exhaustive_enums, clippy::exhaustive_structs)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: try adding #[non_exhaustive]
|
||||
|
|
||||
LL | #[non_exhaustive]
|
||||
LL | pub struct Exhaustive {
|
||||
|
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue