//@aux-build:proc_macros.rs
#![deny(clippy::implicit_hasher)]

#[macro_use]
extern crate proc_macros;

use std::cmp::Eq;
use std::collections::{HashMap, HashSet};
use std::hash::{BuildHasher, Hash};

pub trait Foo<T>: Sized {
    fn make() -> (Self, Self);
}

impl<K: Hash + Eq, V, S: ::std::hash::BuildHasher + Default> Foo<i8> for HashMap<K, V, S> {
    //~^ implicit_hasher
    fn make() -> (Self, Self) {
        // OK, don't suggest to modify these
        let _: HashMap<i32, i32> = HashMap::new();
        let _: HashSet<i32> = HashSet::new();

        (HashMap::default(), HashMap::with_capacity_and_hasher(10, Default::default()))
    }
}
impl<K: Hash + Eq, V, S: ::std::hash::BuildHasher + Default> Foo<i8> for (HashMap<K, V, S>,) {
    //~^ implicit_hasher
    fn make() -> (Self, Self) {
        ((HashMap::default(),), (HashMap::with_capacity_and_hasher(10, Default::default()),))
    }
}
impl<S: ::std::hash::BuildHasher + Default> Foo<i16> for HashMap<String, String, S> {
    //~^ implicit_hasher
    fn make() -> (Self, Self) {
        (HashMap::default(), HashMap::with_capacity_and_hasher(10, Default::default()))
    }
}

impl<K: Hash + Eq, V, S: BuildHasher + Default> Foo<i32> for HashMap<K, V, S> {
    fn make() -> (Self, Self) {
        (HashMap::default(), HashMap::with_capacity_and_hasher(10, S::default()))
    }
}
impl<S: BuildHasher + Default> Foo<i64> for HashMap<String, String, S> {
    fn make() -> (Self, Self) {
        (HashMap::default(), HashMap::with_capacity_and_hasher(10, S::default()))
    }
}

impl<T: Hash + Eq, S: ::std::hash::BuildHasher + Default> Foo<i8> for HashSet<T, S> {
    //~^ implicit_hasher
    fn make() -> (Self, Self) {
        (HashSet::default(), HashSet::with_capacity_and_hasher(10, Default::default()))
    }
}
impl<S: ::std::hash::BuildHasher + Default> Foo<i16> for HashSet<String, S> {
    //~^ implicit_hasher
    fn make() -> (Self, Self) {
        (HashSet::default(), HashSet::with_capacity_and_hasher(10, Default::default()))
    }
}

impl<T: Hash + Eq, S: BuildHasher + Default> Foo<i32> for HashSet<T, S> {
    fn make() -> (Self, Self) {
        (HashSet::default(), HashSet::with_capacity_and_hasher(10, S::default()))
    }
}
impl<S: BuildHasher + Default> Foo<i64> for HashSet<String, S> {
    fn make() -> (Self, Self) {
        (HashSet::default(), HashSet::with_capacity_and_hasher(10, S::default()))
    }
}

pub fn map<S: ::std::hash::BuildHasher>(map: &mut HashMap<i32, i32, S>) {}
//~^ implicit_hasher

pub fn set<S: ::std::hash::BuildHasher>(set: &mut HashSet<i32, S>) {}
//~^ implicit_hasher

#[inline_macros]
pub mod gen_ {
    use super::*;
    inline! {
        impl<K: Hash + Eq, V, S: ::std::hash::BuildHasher + Default> Foo<u8> for HashMap<K, V, S> {
        //~^ implicit_hasher
            fn make() -> (Self, Self) {
                (HashMap::default(), HashMap::with_capacity_and_hasher(10, Default::default()))
            }
        }

        pub fn bar(_map: &mut HashMap<i32, i32>, _set: &mut HashSet<i32>) {}
    }
}

// When the macro is in a different file, the suggestion spans can't be combined properly
// and should not cause an ICE
// See #2707
#[macro_use]
#[path = "auxiliary/test_macro.rs"]
pub mod test_macro;
__implicit_hasher_test_macro!(impl<K, V> for HashMap<K, V> where V: test_macro::A);

// #4260
external! {
    pub fn f(input: &HashMap<u32, u32>) {}
}

// #7712
pub async fn election_vote<S: ::std::hash::BuildHasher>(_data: HashMap<i32, i32, S>) {}
//~^ implicit_hasher

fn main() {}

mod issue16128 {
    use super::*;

    macro_rules! times_ten {
        ($num:expr) => {
            $num * 10
        };
    }

    impl<K: Hash + Eq, V, S: ::std::hash::BuildHasher + Default> Foo<u64> for HashMap<K, V, S> {
        //~^ implicit_hasher
        fn make() -> (Self, Self) {
            (HashMap::default(), HashMap::with_capacity_and_hasher(times_ten!(5), Default::default()))
        }
    }

    impl<V: Hash + Eq, S: ::std::hash::BuildHasher + Default> Foo<u64> for HashSet<V, S> {
        //~^ implicit_hasher
        fn make() -> (Self, Self) {
            (HashSet::default(), HashSet::with_capacity_and_hasher(times_ten!(5), Default::default()))
        }
    }
}
