// run-pass

#![deny(dead_code)]

// use different types / traits to test all combinations

trait Const {
    const C: ();
}

trait StaticFn {
    fn sfn();
}

struct ConstStruct;
struct StaticFnStruct;

enum ConstEnum {}
enum StaticFnEnum {}

struct AliasedConstStruct;
struct AliasedStaticFnStruct;

enum AliasedConstEnum {}
enum AliasedStaticFnEnum {}

type AliasConstStruct    = AliasedConstStruct;
type AliasStaticFnStruct = AliasedStaticFnStruct;
type AliasConstEnum      = AliasedConstEnum;
type AliasStaticFnEnum   = AliasedStaticFnEnum;

macro_rules! impl_Const {($($T:ident),*) => {$(
    impl Const for $T {
        const C: () = ();
    }
)*}}

macro_rules! impl_StaticFn {($($T:ident),*) => {$(
    impl StaticFn for $T {
        fn sfn() {}
    }
)*}}

impl_Const!(ConstStruct, ConstEnum, AliasedConstStruct, AliasedConstEnum);
impl_StaticFn!(StaticFnStruct, StaticFnEnum, AliasedStaticFnStruct, AliasedStaticFnEnum);

fn main() {
    let _ = ConstStruct::C;
    let _ = ConstEnum::C;

    StaticFnStruct::sfn();
    StaticFnEnum::sfn();

    let _ = AliasConstStruct::C;
    let _ = AliasConstEnum::C;

    AliasStaticFnStruct::sfn();
    AliasStaticFnEnum::sfn();
}
