#![feature(decl_macro)]

#[rustfmt::skip]
macro x($macro_name:ident, $macro2_name:ident, $type_name:ident, $variant_name:ident) {
    #[repr(u8)]
    pub enum $type_name {
        Variant = 0,
        $variant_name = 1,
    }

    #[macro_export]
    macro_rules! $macro_name {
        () => {{
            assert_eq!($type_name::Variant as u8, 0);
            assert_eq!($type_name::$variant_name as u8, 1);
            assert_eq!(<$type_name>::Variant as u8, 0);
            assert_eq!(<$type_name>::$variant_name as u8, 1);
        }};
    }

    pub macro $macro2_name {
        () => {{
            assert_eq!($type_name::Variant as u8, 0);
            assert_eq!($type_name::$variant_name as u8, 1);
            assert_eq!(<$type_name>::Variant as u8, 0);
            assert_eq!(<$type_name>::$variant_name as u8, 1);
        }},
    }
}

x!(test_variants, test_variants2, MyEnum, Variant);

pub fn check_variants() 
{
    test_variants!();
    test_variants2!();
}