// Checks that applied type arguments of enums, and aliases to them, are respected. // For example, `Self` is never a type constructor. Therefore, no types can be applied to it. // // We also check that the variant to an type-aliased enum cannot be type applied whether // that alias is generic or monomorphic. enum Enum { TSVariant(T), SVariant { v: T }, UVariant } type Alias = Enum; type AliasFixed = Enum<()>; impl Enum { fn ts_variant() { Self::TSVariant(()); //~^ ERROR mismatched types [E0308] Self::TSVariant::<()>(()); //~^ ERROR type arguments are not allowed on this type [E0109] Self::<()>::TSVariant(()); //~^ ERROR type arguments are not allowed on self type [E0109] //~| ERROR mismatched types [E0308] Self::<()>::TSVariant::<()>(()); //~^ ERROR type arguments are not allowed on self type [E0109] //~| ERROR type arguments are not allowed on this type [E0109] } fn s_variant() { Self::SVariant { v: () }; //~^ ERROR mismatched types [E0308] Self::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed on this type [E0109] //~| ERROR mismatched types [E0308] Self::<()>::SVariant { v: () }; //~^ ERROR type arguments are not allowed on self type [E0109] //~| ERROR mismatched types [E0308] Self::<()>::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed on self type [E0109] //~| ERROR type arguments are not allowed on this type [E0109] //~| ERROR mismatched types [E0308] } fn u_variant() { Self::UVariant::<()>; //~^ ERROR type arguments are not allowed on this type [E0109] Self::<()>::UVariant; //~^ ERROR type arguments are not allowed on self type [E0109] Self::<()>::UVariant::<()>; //~^ ERROR type arguments are not allowed on self type [E0109] //~| ERROR type arguments are not allowed on this type [E0109] } } fn main() { // Tuple struct variant Enum::<()>::TSVariant::<()>(()); //~^ ERROR type arguments are not allowed on tuple variant `TSVariant` [E0109] Alias::TSVariant::<()>(()); //~^ ERROR type arguments are not allowed on this type [E0109] Alias::<()>::TSVariant::<()>(()); //~^ ERROR type arguments are not allowed on this type [E0109] AliasFixed::TSVariant::<()>(()); //~^ ERROR type arguments are not allowed on this type [E0109] AliasFixed::<()>::TSVariant(()); //~^ ERROR type alias takes 0 generic arguments but 1 generic argument was supplied [E0107] AliasFixed::<()>::TSVariant::<()>(()); //~^ ERROR type arguments are not allowed on this type [E0109] //~| ERROR type alias takes 0 generic arguments but 1 generic argument was supplied [E0107] // Struct variant Enum::<()>::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed on variant `SVariant` [E0109] Alias::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed on this type [E0109] Alias::<()>::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed on this type [E0109] AliasFixed::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed on this type [E0109] AliasFixed::<()>::SVariant { v: () }; //~^ ERROR type alias takes 0 generic arguments but 1 generic argument was supplied [E0107] AliasFixed::<()>::SVariant::<()> { v: () }; //~^ ERROR type arguments are not allowed on this type [E0109] //~| ERROR type alias takes 0 generic arguments but 1 generic argument was supplied [E0107] // Unit variant Enum::<()>::UVariant::<()>; //~^ ERROR type arguments are not allowed on unit variant `UVariant` [E0109] Alias::UVariant::<()>; //~^ ERROR type arguments are not allowed on this type [E0109] Alias::<()>::UVariant::<()>; //~^ ERROR type arguments are not allowed on this type [E0109] AliasFixed::UVariant::<()>; //~^ ERROR type arguments are not allowed on this type [E0109] AliasFixed::<()>::UVariant; //~^ ERROR type alias takes 0 generic arguments but 1 generic argument was supplied [E0107] AliasFixed::<()>::UVariant::<()>; //~^ ERROR type arguments are not allowed on this type [E0109] //~| ERROR type alias takes 0 generic arguments but 1 generic argument was supplied [E0107] }