Add a lint for maps with zero-sized values
Co-authored-by: Eduardo Broto <ebroto@tutanota.com>
This commit is contained in:
parent
a2d99259a4
commit
f77f1db35b
7 changed files with 437 additions and 0 deletions
68
tests/ui/zero_sized_btreemap_values.rs
Normal file
68
tests/ui/zero_sized_btreemap_values.rs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
#![warn(clippy::zero_sized_map_values)]
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
const CONST_OK: Option<BTreeMap<String, usize>> = None;
|
||||
const CONST_NOT_OK: Option<BTreeMap<String, ()>> = None;
|
||||
|
||||
static STATIC_OK: Option<BTreeMap<String, usize>> = None;
|
||||
static STATIC_NOT_OK: Option<BTreeMap<String, ()>> = None;
|
||||
|
||||
type OkMap = BTreeMap<String, usize>;
|
||||
type NotOkMap = BTreeMap<String, ()>;
|
||||
|
||||
enum TestEnum {
|
||||
Ok(BTreeMap<String, usize>),
|
||||
NotOk(BTreeMap<String, ()>),
|
||||
}
|
||||
|
||||
struct Test {
|
||||
ok: BTreeMap<String, usize>,
|
||||
not_ok: BTreeMap<String, ()>,
|
||||
|
||||
also_not_ok: Vec<BTreeMap<usize, ()>>,
|
||||
}
|
||||
|
||||
trait TestTrait {
|
||||
type Output;
|
||||
|
||||
fn produce_output() -> Self::Output;
|
||||
|
||||
fn weird_map(&self, map: BTreeMap<usize, ()>);
|
||||
}
|
||||
|
||||
impl Test {
|
||||
fn ok(&self) -> BTreeMap<String, usize> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn not_ok(&self) -> BTreeMap<String, ()> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl TestTrait for Test {
|
||||
type Output = BTreeMap<String, ()>;
|
||||
|
||||
fn produce_output() -> Self::Output {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn weird_map(&self, map: BTreeMap<usize, ()>) {
|
||||
todo!();
|
||||
}
|
||||
}
|
||||
|
||||
fn test(map: BTreeMap<String, ()>, key: &str) -> BTreeMap<String, ()> {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn test2(map: BTreeMap<String, usize>, key: &str) -> BTreeMap<String, usize> {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _: BTreeMap<String, ()> = BTreeMap::new();
|
||||
let _: BTreeMap<String, usize> = BTreeMap::new();
|
||||
|
||||
let _: BTreeMap<_, _> = std::iter::empty::<(String, ())>().collect();
|
||||
}
|
||||
107
tests/ui/zero_sized_btreemap_values.stderr
Normal file
107
tests/ui/zero_sized_btreemap_values.stderr
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:5:28
|
||||
|
|
||||
LL | const CONST_NOT_OK: Option<BTreeMap<String, ()>> = None;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::zero-sized-map-values` implied by `-D warnings`
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:8:30
|
||||
|
|
||||
LL | static STATIC_NOT_OK: Option<BTreeMap<String, ()>> = None;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:11:17
|
||||
|
|
||||
LL | type NotOkMap = BTreeMap<String, ()>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:15:11
|
||||
|
|
||||
LL | NotOk(BTreeMap<String, ()>),
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:20:13
|
||||
|
|
||||
LL | not_ok: BTreeMap<String, ()>,
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:22:22
|
||||
|
|
||||
LL | also_not_ok: Vec<BTreeMap<usize, ()>>,
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:30:30
|
||||
|
|
||||
LL | fn weird_map(&self, map: BTreeMap<usize, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:38:25
|
||||
|
|
||||
LL | fn not_ok(&self) -> BTreeMap<String, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:55:14
|
||||
|
|
||||
LL | fn test(map: BTreeMap<String, ()>, key: &str) -> BTreeMap<String, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:55:50
|
||||
|
|
||||
LL | fn test(map: BTreeMap<String, ()>, key: &str) -> BTreeMap<String, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:64:35
|
||||
|
|
||||
LL | let _: BTreeMap<String, ()> = BTreeMap::new();
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:64:12
|
||||
|
|
||||
LL | let _: BTreeMap<String, ()> = BTreeMap::new();
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_btreemap_values.rs:67:12
|
||||
|
|
||||
LL | let _: BTreeMap<_, _> = std::iter::empty::<(String, ())>().collect();
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: aborting due to 13 previous errors
|
||||
|
||||
68
tests/ui/zero_sized_hashmap_values.rs
Normal file
68
tests/ui/zero_sized_hashmap_values.rs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
#![warn(clippy::zero_sized_map_values)]
|
||||
use std::collections::HashMap;
|
||||
|
||||
const CONST_OK: Option<HashMap<String, usize>> = None;
|
||||
const CONST_NOT_OK: Option<HashMap<String, ()>> = None;
|
||||
|
||||
static STATIC_OK: Option<HashMap<String, usize>> = None;
|
||||
static STATIC_NOT_OK: Option<HashMap<String, ()>> = None;
|
||||
|
||||
type OkMap = HashMap<String, usize>;
|
||||
type NotOkMap = HashMap<String, ()>;
|
||||
|
||||
enum TestEnum {
|
||||
Ok(HashMap<String, usize>),
|
||||
NotOk(HashMap<String, ()>),
|
||||
}
|
||||
|
||||
struct Test {
|
||||
ok: HashMap<String, usize>,
|
||||
not_ok: HashMap<String, ()>,
|
||||
|
||||
also_not_ok: Vec<HashMap<usize, ()>>,
|
||||
}
|
||||
|
||||
trait TestTrait {
|
||||
type Output;
|
||||
|
||||
fn produce_output() -> Self::Output;
|
||||
|
||||
fn weird_map(&self, map: HashMap<usize, ()>);
|
||||
}
|
||||
|
||||
impl Test {
|
||||
fn ok(&self) -> HashMap<String, usize> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn not_ok(&self) -> HashMap<String, ()> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl TestTrait for Test {
|
||||
type Output = HashMap<String, ()>;
|
||||
|
||||
fn produce_output() -> Self::Output {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn weird_map(&self, map: HashMap<usize, ()>) {
|
||||
todo!();
|
||||
}
|
||||
}
|
||||
|
||||
fn test(map: HashMap<String, ()>, key: &str) -> HashMap<String, ()> {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn test2(map: HashMap<String, usize>, key: &str) -> HashMap<String, usize> {
|
||||
todo!();
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _: HashMap<String, ()> = HashMap::new();
|
||||
let _: HashMap<String, usize> = HashMap::new();
|
||||
|
||||
let _: HashMap<_, _> = std::iter::empty::<(String, ())>().collect();
|
||||
}
|
||||
107
tests/ui/zero_sized_hashmap_values.stderr
Normal file
107
tests/ui/zero_sized_hashmap_values.stderr
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:5:28
|
||||
|
|
||||
LL | const CONST_NOT_OK: Option<HashMap<String, ()>> = None;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::zero-sized-map-values` implied by `-D warnings`
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:8:30
|
||||
|
|
||||
LL | static STATIC_NOT_OK: Option<HashMap<String, ()>> = None;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:11:17
|
||||
|
|
||||
LL | type NotOkMap = HashMap<String, ()>;
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:15:11
|
||||
|
|
||||
LL | NotOk(HashMap<String, ()>),
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:20:13
|
||||
|
|
||||
LL | not_ok: HashMap<String, ()>,
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:22:22
|
||||
|
|
||||
LL | also_not_ok: Vec<HashMap<usize, ()>>,
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:30:30
|
||||
|
|
||||
LL | fn weird_map(&self, map: HashMap<usize, ()>);
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:38:25
|
||||
|
|
||||
LL | fn not_ok(&self) -> HashMap<String, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:55:14
|
||||
|
|
||||
LL | fn test(map: HashMap<String, ()>, key: &str) -> HashMap<String, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:55:49
|
||||
|
|
||||
LL | fn test(map: HashMap<String, ()>, key: &str) -> HashMap<String, ()> {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:64:34
|
||||
|
|
||||
LL | let _: HashMap<String, ()> = HashMap::new();
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:64:12
|
||||
|
|
||||
LL | let _: HashMap<String, ()> = HashMap::new();
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: map with zero-sized value type
|
||||
--> $DIR/zero_sized_hashmap_values.rs:67:12
|
||||
|
|
||||
LL | let _: HashMap<_, _> = std::iter::empty::<(String, ())>().collect();
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider using a set instead
|
||||
|
||||
error: aborting due to 13 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue