3 #![feature(type_alias_enum_variants)]
5 #![allow(irrefutable_let_patterns)]
8 enum Enum<T> { TSVariant(T), SVariant { v: T } }
9 type Alias<T> = Enum<T>;
10 type AliasFixed = Enum<()>;
12 macro_rules! is_variant {
13 (TSVariant, $expr:expr) => (is_variant!(@check TSVariant, (_), $expr));
14 (SVariant, $expr:expr) => (is_variant!(@check SVariant, { v: _ }, $expr));
15 (@check $variant:ident, $matcher:tt, $expr:expr) => (
16 assert!(if let Enum::$variant::<()> $matcher = $expr { true } else { false },
17 "expr does not have correct type");
22 // Tuple struct variant
24 is_variant!(TSVariant, Enum::TSVariant(()));
25 is_variant!(TSVariant, Enum::TSVariant::<()>(()));
26 is_variant!(TSVariant, Enum::<()>::TSVariant(()));
28 is_variant!(TSVariant, Alias::TSVariant(()));
29 is_variant!(TSVariant, Alias::<()>::TSVariant(()));
31 is_variant!(TSVariant, AliasFixed::TSVariant(()));
35 is_variant!(SVariant, Enum::SVariant { v: () });
36 is_variant!(SVariant, Enum::SVariant::<()> { v: () });
37 is_variant!(SVariant, Enum::<()>::SVariant { v: () });
39 is_variant!(SVariant, Alias::SVariant { v: () });
40 is_variant!(SVariant, Alias::<()>::SVariant { v: () });
42 is_variant!(SVariant, AliasFixed::SVariant { v: () });