// run-pass // Check that it is possible to resolve, in the value namespace, // to an `enum` variant through a type alias. This includes `Self`. // Type qualified syntax `::Variant` also works when syntactically valid. #[derive(Debug, PartialEq, Eq)] enum Foo { Bar(i32), Baz { i: i32 }, Qux, } type FooAlias = Foo; type OptionAlias = Option; macro_rules! check_pat { ($x:expr, $p:pat) => { assert!(if let $p = $x { true } else { false }); }; } impl Foo { fn bar() -> Self { let x = Self::Bar(3); assert_eq!(x, ::Bar(3)); check_pat!(x, Self::Bar(3)); x } fn baz() -> Self { let x = Self::Baz { i: 42 }; check_pat!(x, Self::Baz { i: 42 }); x } fn qux() -> Self { let x = Self::Qux; assert_eq!(x, ::Qux); check_pat!(x, Self::Qux); check_pat!(x, ::Qux); x } } fn main() { let bar = Foo::Bar(1); assert_eq!(bar, FooAlias::Bar(1)); assert_eq!(bar, ::Bar(1)); check_pat!(bar, FooAlias::Bar(1)); let baz = FooAlias::Baz { i: 2 }; assert_eq!(baz, Foo::Baz { i: 2 }); check_pat!(baz, FooAlias::Baz { i: 2 }); let qux = Foo::Qux; assert_eq!(qux, FooAlias::Qux); assert_eq!(qux, ::Qux); check_pat!(qux, FooAlias::Qux); check_pat!(qux, ::Qux); assert_eq!(Foo::bar(), Foo::Bar(3)); assert_eq!(Foo::baz(), Foo::Baz { i: 42 }); assert_eq!(Foo::qux(), Foo::Qux); let some = Option::Some(4); assert_eq!(some, OptionAlias::Some(4)); check_pat!(some, OptionAlias::Some(4)); }