blob: 39677733d524db1b424d513da136ad5bc90cd691 [file] [log] [blame]
// 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 `<Type>::Variant` also works when syntactically valid.
#[derive(Debug, PartialEq, Eq)]
enum Foo {
Bar(i32),
Baz { i: i32 },
Qux,
}
type FooAlias = Foo;
type OptionAlias = Option<i32>;
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, <Self>::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, <Self>::Qux);
check_pat!(x, Self::Qux);
check_pat!(x, <Self>::Qux);
x
}
}
fn main() {
let bar = Foo::Bar(1);
assert_eq!(bar, FooAlias::Bar(1));
assert_eq!(bar, <FooAlias>::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, <FooAlias>::Qux);
check_pat!(qux, FooAlias::Qux);
check_pat!(qux, <FooAlias>::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));
}