class In { ~In.f:T->Unit~fun f(t : T) : Unit {} ~In.f:Int->Int~fun f(t : Int) : Int {} ~In.f1~fun f1(t : T) : Unit {} } class Out { ~Out.f~fun f() : T {} ~Out.f(a)~fun f(a : Int) : Int {a} } class Inv { ~Inv.f~fun f(t : T) : T {t} ~Inv.inf~fun inf(t : T) : Unit {} ~Inv.outf~fun outf() : T {} } fun testInOut() { new In().`In.f:T->Unit`f("1"); (return : In).`In.f:T->Unit`f("1"); (return : In).`!`f("1") (return : In<*>).`!`f("1"); new In().`In.f:Int->Int`f(1); (return : In).`In.f:Int->Int`f(1); (return : In).`In.f:Int->Int`f(1) (return : In).`!`f1(1) (return : In<*>).`In.f:Int->Int`f(1); new Out().`Out.f(a)`f(1) (return : Out).`Out.f(a)`f(1) (return : Out).`Out.f(a)`f(1) (return : Out<*>).`Out.f(a)`f(1) new Out().`Out.f`f() (return : Out).`Out.f`f() (return : Out).`Out.f`f() (return : Out<*>).`Out.f`f() new Inv().`Inv.f`f(1) (return : Inv).`Inv.f`f(1) (return : Inv).`!`f(1) (return : Inv<*>).`!`f(1) new Inv().`Inv.inf`inf(1) (return : Inv).`Inv.inf`inf(1) (return : Inv).`!`inf(1) (return : Inv<*>).`!`inf(1) new Inv().`Inv.outf`outf() ((return : Inv).`Inv.outf`outf())`:std::Any` (return : Inv).`Inv.outf`outf() (return : Inv<*>).`Inv.outf`outf() new Inv().`Inv.outf`outf(1) }