|
1 | 1 | // run-pass |
2 | 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 | + |
3 | 10 | #![allow(irrefutable_let_patterns)] |
4 | 11 |
|
5 | 12 | #[allow(dead_code)] |
6 | | -enum Enum<T> { TSVariant(T), SVariant { v: T } } |
| 13 | +enum Enum<T> { TSVariant(T), SVariant { v: T }, UVariant } |
7 | 14 | type Alias<T> = Enum<T>; |
8 | 15 | type AliasFixed = Enum<()>; |
9 | 16 |
|
10 | 17 | macro_rules! is_variant { |
11 | 18 | (TSVariant, $expr:expr) => (is_variant!(@check TSVariant, (_), $expr)); |
12 | 19 | (SVariant, $expr:expr) => (is_variant!(@check SVariant, { v: _ }, $expr)); |
| 20 | + (UVariant, $expr:expr) => (is_variant!(@check UVariant, {}, $expr)); |
13 | 21 | (@check $variant:ident, $matcher:tt, $expr:expr) => ( |
14 | 22 | assert!(if let Enum::$variant::<()> $matcher = $expr { true } else { false }, |
15 | 23 | "expr does not have correct type"); |
@@ -38,4 +46,15 @@ fn main() { |
38 | 46 | is_variant!(SVariant, Alias::<()>::SVariant { v: () }); |
39 | 47 |
|
40 | 48 | is_variant!(SVariant, AliasFixed::SVariant { v: () }); |
| 49 | + |
| 50 | + // Unit variant |
| 51 | + |
| 52 | + is_variant!(UVariant, Enum::UVariant); |
| 53 | + is_variant!(UVariant, Enum::UVariant::<()>); |
| 54 | + is_variant!(UVariant, Enum::<()>::UVariant); |
| 55 | + |
| 56 | + is_variant!(UVariant, Alias::UVariant); |
| 57 | + is_variant!(UVariant, Alias::<()>::UVariant); |
| 58 | + |
| 59 | + is_variant!(UVariant, AliasFixed::UVariant); |
41 | 60 | } |
0 commit comments