genericCallWithNonSymmetricSubtypes.ts(6,12): error TS2454: Variable 'r' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(12,13): error TS2454: Variable 'a' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(12,16): error TS2454: Variable 'b' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(13,14): error TS2454: Variable 'b' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(13,17): error TS2454: Variable 'a' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(18,14): error TS2454: Variable 'a' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(18,17): error TS2454: Variable 'x' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(19,14): error TS2454: Variable 'x' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(19,17): error TS2454: Variable 'a' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(21,14): error TS2454: Variable 'a' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(21,17): error TS2454: Variable 'y' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(22,14): error TS2454: Variable 'y' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(22,17): error TS2454: Variable 'a' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(24,14): error TS2454: Variable 'x' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(24,17): error TS2454: Variable 'y' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(25,14): error TS2454: Variable 'y' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(25,17): error TS2454: Variable 'x' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(30,14): error TS2454: Variable 's1' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(30,18): error TS2454: Variable 's2' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(31,14): error TS2454: Variable 's2' is used before being assigned.
genericCallWithNonSymmetricSubtypes.ts(31,18): error TS2454: Variable 's1' is used before being assigned.


==== genericCallWithNonSymmetricSubtypes.ts (21 errors) ====
    // generic type argument inference where inference leads to two candidates that are both supertypes of all candidates
    // we choose the first candidate so the result is dependent on the order of the arguments provided
    
    function foo<T>(x: T, y: T) {
        var r: T;
        return r;
               ~
!!! error TS2454: Variable 'r' is used before being assigned.
    }
    
    var a: { x: number; y?: number; };
    var b: { x: number; z?: number; };
    
    var r = foo(a, b); // { x: number; y?: number; };
                ~
!!! error TS2454: Variable 'a' is used before being assigned.
                   ~
!!! error TS2454: Variable 'b' is used before being assigned.
    var r2 = foo(b, a); // { x: number; z?: number; };
                 ~
!!! error TS2454: Variable 'b' is used before being assigned.
                    ~
!!! error TS2454: Variable 'a' is used before being assigned.
    
    var x: { x: number; };
    var y: { x?: number; };
    
    var r3 = foo(a, x); // { x: number; y?: number; };
                 ~
!!! error TS2454: Variable 'a' is used before being assigned.
                    ~
!!! error TS2454: Variable 'x' is used before being assigned.
    var r4 = foo(x, a); // { x: number; };
                 ~
!!! error TS2454: Variable 'x' is used before being assigned.
                    ~
!!! error TS2454: Variable 'a' is used before being assigned.
    
    var r5 = foo(a, y); // { x?: number; };
                 ~
!!! error TS2454: Variable 'a' is used before being assigned.
                    ~
!!! error TS2454: Variable 'y' is used before being assigned.
    var r5 = foo(y, a); // { x?: number; };
                 ~
!!! error TS2454: Variable 'y' is used before being assigned.
                    ~
!!! error TS2454: Variable 'a' is used before being assigned.
    
    var r6 = foo(x, y); // { x?: number; };
                 ~
!!! error TS2454: Variable 'x' is used before being assigned.
                    ~
!!! error TS2454: Variable 'y' is used before being assigned.
    var r6 = foo(y, x); // { x?: number; };
                 ~
!!! error TS2454: Variable 'y' is used before being assigned.
                    ~
!!! error TS2454: Variable 'x' is used before being assigned.
    
    var s1: (x: Object) => string;
    var s2: (x: string) => string;
    
    var r7 = foo(s1, s2); // (x: Object) => string;
                 ~~
!!! error TS2454: Variable 's1' is used before being assigned.
                     ~~
!!! error TS2454: Variable 's2' is used before being assigned.
    var r8 = foo(s2, s1); // (x: string) => string;
                 ~~
!!! error TS2454: Variable 's2' is used before being assigned.
                     ~~
!!! error TS2454: Variable 's1' is used before being assigned.