#![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!(); }