blob: ee2fd19b5ee5aa9be58146215782fa3ddf821936 [file] [log] [blame] [edit]
#![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;
//~^ zero_sized_map_values
static STATIC_OK: Option<HashMap<String, usize>> = None;
static STATIC_NOT_OK: Option<HashMap<String, ()>> = None;
//~^ zero_sized_map_values
type OkMap = HashMap<String, usize>;
type NotOkMap = HashMap<String, ()>;
//~^ zero_sized_map_values
enum TestEnum {
Ok(HashMap<String, usize>),
NotOk(HashMap<String, ()>),
//~^ zero_sized_map_values
}
struct Test {
ok: HashMap<String, usize>,
not_ok: HashMap<String, ()>,
//~^ zero_sized_map_values
also_not_ok: Vec<HashMap<usize, ()>>,
//~^ zero_sized_map_values
}
trait TestTrait {
type Output;
fn produce_output() -> Self::Output;
fn weird_map(&self, map: HashMap<usize, ()>);
//~^ zero_sized_map_values
}
impl Test {
fn ok(&self) -> HashMap<String, usize> {
todo!()
}
fn not_ok(&self) -> HashMap<String, ()> {
//~^ zero_sized_map_values
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, ()> {
//~^ zero_sized_map_values
//~| zero_sized_map_values
todo!();
}
fn test2(map: HashMap<String, usize>, key: &str) -> HashMap<String, usize> {
todo!();
}
fn issue14822() {
trait Trait {
type T;
}
struct S<T: Trait>(T::T);
// The `delay_bug` happens when evaluating the pointer metadata of `S<T>` which depends on
// whether `T::T` is `Sized`. Since the type alias doesn't have a trait bound of `T: Trait`
// evaluating `T::T: Sized` ultimately fails with `NoSolution`.
type A<T> = HashMap<u32, *const S<T>>;
type B<T> = HashMap<u32, S<T>>;
enum E {}
impl Trait for E {
type T = ();
}
type C = HashMap<u32, *const S<E>>;
type D = HashMap<u32, S<E>>;
//~^ zero_sized_map_values
}
fn issue15429() {
struct E<'a>(&'a [E<'a>]);
// The assertion error happens when the type being evaluated has escaping bound vars
// as it cannot be wrapped in a dummy binder during size computation.
type F = dyn for<'a> FnOnce(HashMap<u32, E<'a>>) -> u32;
}
fn main() {
let _: HashMap<String, ()> = HashMap::new();
//~^ zero_sized_map_values
//~| zero_sized_map_values
let _: HashMap<String, usize> = HashMap::new();
let _: HashMap<_, _> = std::iter::empty::<(String, ())>().collect();
//~^ zero_sized_map_values
}