// 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<T> { TSVariant(T), SVariant { v: T }, UVariant }
type Alias<T> = Enum<T>;
type AliasFixed = Enum<()>;

impl<T> Enum<T> {
    fn ts_variant() {
        Self::TSVariant(());
        //~^ ERROR mismatched types [E0308]
        Self::TSVariant::<()>(());
        //~^ ERROR type arguments are not allowed for this type [E0109]
        Self::<()>::TSVariant(());
        //~^ ERROR type arguments are not allowed for this type [E0109]
        //~^^ ERROR mismatched types [E0308]
        Self::<()>::TSVariant::<()>(());
        //~^ ERROR type arguments are not allowed for this type [E0109]
        //~^^ ERROR type arguments are not allowed for this type [E0109]
    }

    fn s_variant() {
        Self::SVariant { v: () };
        //~^ ERROR mismatched types [E0308]
        Self::SVariant::<()> { v: () };
        //~^ ERROR type arguments are not allowed for this type [E0109]
        //~^^ ERROR mismatched types [E0308]
        Self::<()>::SVariant { v: () };
        //~^ ERROR type arguments are not allowed for this type [E0109]
        //~^^ ERROR mismatched types [E0308]
        Self::<()>::SVariant::<()> { v: () };
        //~^ ERROR type arguments are not allowed for this type [E0109]
        //~^^ ERROR type arguments are not allowed for this type [E0109]
        //~^^^ ERROR mismatched types [E0308]
    }

    fn u_variant() {
        Self::UVariant::<()>;
        //~^ ERROR type arguments are not allowed for this type [E0109]
        Self::<()>::UVariant;
        //~^ ERROR type arguments are not allowed for this type [E0109]
        Self::<()>::UVariant::<()>;
        //~^ ERROR type arguments are not allowed for this type [E0109]
        //~^^ ERROR type arguments are not allowed for this type [E0109]
    }
}

fn main() {
    // Tuple struct variant

    Enum::<()>::TSVariant::<()>(());
    //~^ ERROR type arguments are not allowed for this type [E0109]

    Alias::TSVariant::<()>(());
    //~^ ERROR type arguments are not allowed for this type [E0109]
    Alias::<()>::TSVariant::<()>(());
    //~^ ERROR type arguments are not allowed for this type [E0109]

    AliasFixed::TSVariant::<()>(());
    //~^ ERROR type arguments are not allowed for this type [E0109]
    AliasFixed::<()>::TSVariant(());
    //~^ ERROR wrong number of type arguments: expected 0, found 1 [E0107]
    AliasFixed::<()>::TSVariant::<()>(());
    //~^ ERROR type arguments are not allowed for this type [E0109]
    //~^^ ERROR wrong number of type arguments: expected 0, found 1 [E0107]

    // Struct variant

    Enum::<()>::SVariant::<()> { v: () };
    //~^ ERROR type arguments are not allowed for this type [E0109]

    Alias::SVariant::<()> { v: () };
    //~^ ERROR type arguments are not allowed for this type [E0109]
    Alias::<()>::SVariant::<()> { v: () };
    //~^ ERROR type arguments are not allowed for this type [E0109]

    AliasFixed::SVariant::<()> { v: () };
    //~^ ERROR type arguments are not allowed for this type [E0109]
    AliasFixed::<()>::SVariant { v: () };
    //~^ ERROR wrong number of type arguments: expected 0, found 1 [E0107]
    AliasFixed::<()>::SVariant::<()> { v: () };
    //~^ ERROR type arguments are not allowed for this type [E0109]
    //~^^ ERROR wrong number of type arguments: expected 0, found 1 [E0107]

    // Unit variant

    Enum::<()>::UVariant::<()>;
    //~^ ERROR type arguments are not allowed for this type [E0109]

    Alias::UVariant::<()>;
    //~^ ERROR type arguments are not allowed for this type [E0109]
    Alias::<()>::UVariant::<()>;
    //~^ ERROR type arguments are not allowed for this type [E0109]

    AliasFixed::UVariant::<()>;
    //~^ ERROR type arguments are not allowed for this type [E0109]
    AliasFixed::<()>::UVariant;
    //~^ ERROR wrong number of type arguments: expected 0, found 1 [E0107]
    AliasFixed::<()>::UVariant::<()>;
    //~^ ERROR type arguments are not allowed for this type [E0109]
    //~^^ ERROR wrong number of type arguments: expected 0, found 1 [E0107]
}
