



// Initializers
var varInit = varInit; // any
var pInit: any;
function fn(pInit = pInit) {
    var pInit: any;
}
class InitClass {
    x = this.x;
    fn() {
        var y = this.x;
        var y: any;
    }
}

// Return type
function fnReturn1() {
    return fnReturn1();
}
var a: any;
var a = fnReturn1();

function fnReturn2() {
    return fnReturn2;
}
var fnr2: () => any = fnReturn2();

// Comma
var co1 = (co1, 3);
var co1: number;
var co2 = (3, 4, co2);
var co2: any;
var co3 = (co1, co2, co3, co1);
var co3: number;

// Assignment
var as1 = (as1 = 2);
var as1: number;
var as2 = (as2 = as2 = 2);
var as2: number;

// Conditional
var cnd1 = cnd1 ? 0 : 1;
var cnd1: number;
var cnd2 = cnd1 ? cnd1 ? '' : "" : '';
var cnd2: string;

// ||
var or1 = or1 || '';
var or1: any;
var or2 = '' || or2;
var or2: any;
var or3 = or3 || or3;
var or3: any;

// &&
var and1 = and1 && '';
var and1: string;
var and2 = '' && and2;
var and2: any;
var and3 = and3 && and3;
var and3: any;

// function call return type
function fnCall() {
    return fnCall();
}
var fnCallResult = fnCall();
var fnCallResult: any;

// Call argument
function fnArg1(x: typeof fnArg1, y: number) {
    var x: (n: typeof fnArg1, m: number) => void;
    fnArg1(fnArg1, 0);
}

function overload1(x: (n: string) => string): string;
function overload1(x: (n: number) => number): number;
function overload1(x: (n: any) => any): any;
function overload1() { return undefined; };

function fnArg2() {
    return overload1(fnArg2);
}
var t = fnArg2(); // t: should be 'any', but is 'string'

// New operator
class C {
    fn1() {
        return new (this.fn1())();
    }
    fn2() {
        return new (this.fn2());
    }
    fn3() {
        var a: new(x) => number;
        return new a(this.fn3);
    }
}

function fn5() {
    var a: new (x) => number;
    return new a(fn5);
}
var fn5r = fn5(); // fn5r: should be 'any', but is 'number'

// Property access
var propAcc1 = {
    m: propAcc1.m
};
var propAcc1: { m: any; }

// Property access of module member
module M2 {
    export var x = M2.x;
    var y = x;
    var y: any;
}

// Property access of class instance type
class C2 {
    n = this.n; // n: any
}
var c2inst = new C2().n;
var c2inst: any;

// Constructor function property access
class C3 {
    static q = C3.q;
}
var qq = C3.q;
var qq: any;

// Parentheses - tested a bunch above


