|
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