]> git.lizzy.rs Git - rust.git/blob - src/test/ui/pattern/enum-variant-generic-args.rs
Rollup merge of #57418 - lqd:collector_query, r=michaelwoerister
[rust.git] / src / test / ui / pattern / enum-variant-generic-args.rs
1 // run-pass
2
3 #![feature(type_alias_enum_variants)]
4
5 #![allow(irrefutable_let_patterns)]
6
7 #[allow(dead_code)]
8 enum Enum<T> { TSVariant(T), SVariant { v: T } }
9 type Alias<T> = Enum<T>;
10 type AliasFixed = Enum<()>;
11
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");
18     );
19 }
20
21 fn main() {
22     // Tuple struct variant
23
24     is_variant!(TSVariant, Enum::TSVariant(()));
25     is_variant!(TSVariant, Enum::TSVariant::<()>(()));
26     is_variant!(TSVariant, Enum::<()>::TSVariant(()));
27
28     is_variant!(TSVariant, Alias::TSVariant(()));
29     is_variant!(TSVariant, Alias::<()>::TSVariant(()));
30
31     is_variant!(TSVariant, AliasFixed::TSVariant(()));
32
33     // Struct variant
34
35     is_variant!(SVariant, Enum::SVariant { v: () });
36     is_variant!(SVariant, Enum::SVariant::<()> { v: () });
37     is_variant!(SVariant, Enum::<()>::SVariant { v: () });
38
39     is_variant!(SVariant, Alias::SVariant { v: () });
40     is_variant!(SVariant, Alias::<()>::SVariant { v: () });
41
42     is_variant!(SVariant, AliasFixed::SVariant { v: () });
43 }