#![warn(clippy::all)]
#![allow(clippy::boxed_local, clippy::needless_pass_by_value)]
#![allow(clippy::disallowed_names, unused_variables, dead_code)]
#![allow(unused_imports)]

pub struct MyStruct;

pub struct SubT<T> {
    foo: T,
}

pub enum MyEnum {
    One,
    Two,
}

mod outer_box {
    use crate::{MyEnum, MyStruct, SubT};
    use std::boxed::Box;
    use std::rc::Rc;
    use std::sync::Arc;

    pub fn box_test1<T>(foo: &T) {}

    pub fn box_test2(foo: &MyStruct) {}

    pub fn box_test3(foo: &MyEnum) {}

    pub fn box_test4_neg(foo: Box<SubT<&usize>>) {}

    pub fn box_test5<T>(foo: Box<T>) {}
}

mod outer_rc {
    use crate::{MyEnum, MyStruct, SubT};
    use std::boxed::Box;
    use std::rc::Rc;
    use std::sync::Arc;

    pub fn rc_test1<T>(foo: &T) {}

    pub fn rc_test2(foo: &MyStruct) {}

    pub fn rc_test3(foo: &MyEnum) {}

    pub fn rc_test4_neg(foo: Rc<SubT<&usize>>) {}

    pub fn rc_test6(a: Rc<bool>) {}
}

mod outer_arc {
    use crate::{MyEnum, MyStruct, SubT};
    use std::boxed::Box;
    use std::rc::Rc;
    use std::sync::Arc;

    pub fn arc_test1<T>(foo: &T) {}

    pub fn arc_test2(foo: &MyStruct) {}

    pub fn arc_test3(foo: &MyEnum) {}

    pub fn arc_test4_neg(foo: Arc<SubT<&usize>>) {}

    pub fn arc_test7(a: Arc<bool>) {}
}

fn main() {}