// !CHECK_TYPE class In() { fun f(t : T) : Unit {} fun f(t : Int) : Int = 1 fun f1(t : T) : Unit {} } class Out() { fun f() : T {throw IllegalStateException()} fun f(a : Int) : Int = a } class Inv() { fun f(t : T) : T = t fun inf(t : T) : Unit {} fun outf() : T {throw IllegalStateException()} } fun testInOut() { In().f("1"); (null as In<in String>).f("1") (null as In<*>).f("1") // Wrong Arg In().f(1); (null as In<in String>).f(1) (null as In<*>).f(1); Out().f(1) (null as Out<out Int>).f(1) (null as Out<*>).f(1) Out().f() (null as Out<out Int>).f() (null as Out<*>).f() Inv().f(1) (null as Inv).f(1) (null as Inv).f(1) // !! (null as Inv<*>).f(1) // !! Inv().inf(1) (null as Inv).inf(1) (null as Inv).inf(1) // !! (null as Inv<*>).inf(1) // !! Inv().outf() checkSubtype((null as Inv).outf()) // Type mismatch (null as Inv).outf() (null as Inv<*>).outf() Inv().outf(1) // Wrong Arg }