var foo1 = function(x:T):T { return x; } function foo2(x:T):S { return x; } var foo3 = function (x:T):T { return foo3(x); } function foo4(x:T):S { return foo4(x); } var x = []; function foo5():Array { return x; } /* var a = foo5(); a[0] = 0; var b = foo5(); var y: string = b[0]; */ var foo6 = function(x:R):R { return foo1(x); } function foo7(x:R):R { return foo5(); } function foo8(x:U,y):U { var z = foo8(x,x); y(); return x; } /* foo8(0,void 0); */