]> git.lizzy.rs Git - rust.git/blob - src/test/ui/type-alias-enum-variants/enum-variant-generic-args-pass.rs
Rollup merge of #95534 - jyn514:std-mem-copy, r=joshtriplett
[rust.git] / src / test / ui / type-alias-enum-variants / enum-variant-generic-args-pass.rs
1 // run-pass
2
3 // Check that resolving, in the value namespace, to an `enum` variant
4 // through a type alias is well behaved in the presence of generics.
5 // We check for situations with:
6 // 1. a generic type `Alias<T>`, we can type-apply `Alias` when referring to a variant.
7 // 2. a monotype `AliasFixed` of generic `Enum<T>`, we can refer to variants
8 //    and the type-application of `T` in `AliasFixed` is kept.
9
10 #![allow(irrefutable_let_patterns)]
11
12 enum Enum<T> { TSVariant(T), SVariant { _v: T }, UVariant }
13 type Alias<T> = Enum<T>;
14 type AliasFixed = Enum<()>;
15
16 macro_rules! is_variant {
17     (TSVariant, $expr:expr) => (is_variant!(@check TSVariant, (_), $expr));
18     (SVariant, $expr:expr) => (is_variant!(@check SVariant, { _v: _ }, $expr));
19     (UVariant, $expr:expr) => (is_variant!(@check UVariant, {}, $expr));
20     (@check $variant:ident, $matcher:tt, $expr:expr) => (
21         assert!(if let Enum::$variant::<()> $matcher = $expr { true } else { false },
22                 "expr does not have correct type");
23     );
24 }
25
26 fn main() {
27     // Tuple struct variant
28
29     is_variant!(TSVariant, Enum::TSVariant(()));
30     is_variant!(TSVariant, Enum::TSVariant::<()>(()));
31     is_variant!(TSVariant, Enum::<()>::TSVariant(()));
32
33     is_variant!(TSVariant, Alias::TSVariant(()));
34     is_variant!(TSVariant, Alias::<()>::TSVariant(()));
35
36     is_variant!(TSVariant, AliasFixed::TSVariant(()));
37
38     // Struct variant
39
40     is_variant!(SVariant, Enum::SVariant { _v: () });
41     is_variant!(SVariant, Enum::SVariant::<()> { _v: () });
42     is_variant!(SVariant, Enum::<()>::SVariant { _v: () });
43
44     is_variant!(SVariant, Alias::SVariant { _v: () });
45     is_variant!(SVariant, Alias::<()>::SVariant { _v: () });
46
47     is_variant!(SVariant, AliasFixed::SVariant { _v: () });
48
49     // Unit variant
50
51     is_variant!(UVariant, Enum::UVariant);
52     is_variant!(UVariant, Enum::UVariant::<()>);
53     is_variant!(UVariant, Enum::<()>::UVariant);
54
55     is_variant!(UVariant, Alias::UVariant);
56     is_variant!(UVariant, Alias::<()>::UVariant);
57
58     is_variant!(UVariant, AliasFixed::UVariant);
59 }