]> git.lizzy.rs Git - rust.git/blob - src/test/ui/type-alias-enum-variants/type-alias-enum-variants-pass.rs
Rollup merge of #82739 - jyn514:separate-stage0-stage1, r=Mark-Simulacrum
[rust.git] / src / test / ui / type-alias-enum-variants / type-alias-enum-variants-pass.rs
1 // run-pass
2
3 // Check that it is possible to resolve, in the value namespace,
4 // to an `enum` variant through a type alias. This includes `Self`.
5 // Type qualified syntax `<Type>::Variant` also works when syntactically valid.
6
7 #[derive(Debug, PartialEq, Eq)]
8 enum Foo {
9     Bar(i32),
10     Baz { i: i32 },
11     Qux,
12 }
13
14 type FooAlias = Foo;
15 type OptionAlias = Option<i32>;
16
17 macro_rules! check_pat {
18     ($x:expr, $p:pat) => {
19         assert!(if let $p = $x { true } else { false });
20     };
21 }
22
23 impl Foo {
24     fn bar() -> Self {
25         let x = Self::Bar(3);
26         assert_eq!(x, <Self>::Bar(3));
27         check_pat!(x, Self::Bar(3));
28         x
29     }
30
31     fn baz() -> Self {
32         let x = Self::Baz { i: 42 };
33         check_pat!(x, Self::Baz { i: 42 });
34         x
35     }
36
37     fn qux() -> Self {
38         let x = Self::Qux;
39         assert_eq!(x, <Self>::Qux);
40         check_pat!(x, Self::Qux);
41         check_pat!(x, <Self>::Qux);
42         x
43     }
44 }
45
46 fn main() {
47     let bar = Foo::Bar(1);
48     assert_eq!(bar, FooAlias::Bar(1));
49     assert_eq!(bar, <FooAlias>::Bar(1));
50     check_pat!(bar, FooAlias::Bar(1));
51
52     let baz = FooAlias::Baz { i: 2 };
53     assert_eq!(baz, Foo::Baz { i: 2 });
54     check_pat!(baz, FooAlias::Baz { i: 2 });
55
56     let qux = Foo::Qux;
57     assert_eq!(qux, FooAlias::Qux);
58     assert_eq!(qux, <FooAlias>::Qux);
59     check_pat!(qux, FooAlias::Qux);
60     check_pat!(qux, <FooAlias>::Qux);
61
62     assert_eq!(Foo::bar(), Foo::Bar(3));
63     assert_eq!(Foo::baz(), Foo::Baz { i: 42 });
64     assert_eq!(Foo::qux(), Foo::Qux);
65
66     let some = Option::Some(4);
67     assert_eq!(some, OptionAlias::Some(4));
68     check_pat!(some, OptionAlias::Some(4));
69 }