//// [logicalOrOperatorWithEveryType.ts]
// The || operator permits the operands to be of any type.
// If the || expression is not contextually typed, the right operand is contextually typed
// by the type of the left operand and the result is of the best common type of the two
// operand types.

enum E { a, b, c }

var a1: any;
var a2: boolean;
var a3: number
var a4: string;
var a5: void;
var a6: E;
var a7: {a: string};
var a8: string[];

var ra1 = a1 || a1;         // any       || any is any
var ra2 = a2 || a1;         // boolean   || any is any
var ra3 = a3 || a1;         // number    || any is any
var ra4 = a4 || a1;         // string    || any is any
var ra5 = a5 || a1;         // void      || any is any
var ra6 = a6 || a1;         // enum      || any is any
var ra7 = a7 || a1;         // object    || any is any
var ra8 = a8 || a1;         // array     || any is any
var ra9 = null || a1;       // null      || any is any
var ra10 = undefined || a1; // undefined || any is any

var rb1 = a1 || a2;         // any       || boolean is any
var rb2 = a2 || a2;         // boolean   || boolean is boolean
var rb3 = a3 || a2;         // number    || boolean is number | boolean
var rb4 = a4 || a2;         // string    || boolean is string | boolean
var rb5 = a5 || a2;         // void      || boolean is void | boolean
var rb6 = a6 || a2;         // enum      || boolean is E | boolean
var rb7 = a7 || a2;         // object    || boolean is object | boolean
var rb8 = a8 || a2;         // array     || boolean is array | boolean
var rb9 = null || a2;       // null      || boolean is boolean
var rb10= undefined || a2;  // undefined || boolean is boolean

var rc1 = a1 || a3;         // any       || number is any
var rc2 = a2 || a3;         // boolean   || number is boolean | number
var rc3 = a3 || a3;         // number    || number is number
var rc4 = a4 || a3;         // string    || number is string | number
var rc5 = a5 || a3;         // void      || number is void | number
var rc6 = a6 || a3;         // enum      || number is number
var rc7 = a7 || a3;         // object    || number is object | number
var rc8 = a8 || a3;         // array     || number is array | number
var rc9 = null || a3;       // null      || number is number
var rc10 = undefined || a3; // undefined || number is number

var rd1 = a1 || a4;         // any       || string is any
var rd2 = a2 || a4;         // boolean   || string is boolean | string
var rd3 = a3 || a4;         // number    || string is number | string
var rd4 = a4 || a4;         // string    || string is string
var rd5 = a5 || a4;         // void      || string is void | string
var rd6 = a6 || a4;         // enum      || string is enum | string
var rd7 = a7 || a4;         // object    || string is object | string
var rd8 = a8 || a4;         // array     || string is array | string
var rd9 = null || a4;       // null      || string is string
var rd10 = undefined || a4; // undefined || string is string

var re1 = a1 || a5;         // any       || void is any
var re2 = a2 || a5;         // boolean   || void is boolean | void
var re3 = a3 || a5;         // number    || void is number | void
var re4 = a4 || a5;         // string    || void is string | void
var re5 = a5 || a5;         // void      || void is void
var re6 = a6 || a5;         // enum      || void is enum | void
var re7 = a7 || a5;         // object    || void is object | void
var re8 = a8 || a5;         // array     || void is array | void
var re9 = null || a5;       // null      || void is void
var re10 = undefined || a5; // undefined || void is void

var rg1 = a1 || a6;         // any       || enum is any
var rg2 = a2 || a6;         // boolean   || enum is boolean | enum
var rg3 = a3 || a6;         // number    || enum is number
var rg4 = a4 || a6;         // string    || enum is string | enum
var rg5 = a5 || a6;         // void      || enum is void | enum
var rg6 = a6 || a6;         // enum      || enum is E
var rg7 = a7 || a6;         // object    || enum is object | enum
var rg8 = a8 || a6;         // array     || enum is array | enum
var rg9 = null || a6;       // null      || enum is E
var rg10 = undefined || a6; // undefined || enum is E

var rh1 = a1 || a7;         // any       || object is any
var rh2 = a2 || a7;         // boolean   || object is boolean | object
var rh3 = a3 || a7;         // number    || object is number | object
var rh4 = a4 || a7;         // string    || object is string | object
var rh5 = a5 || a7;         // void      || object is void | object
var rh6 = a6 || a7;         // enum      || object is enum | object
var rh7 = a7 || a7;         // object    || object is object
var rh8 = a8 || a7;         // array     || object is array | object
var rh9 = null || a7;       // null      || object is object
var rh10 = undefined || a7; // undefined || object is object

var ri1 = a1 || a8;         // any       || array is any
var ri2 = a2 || a8;         // boolean   || array is boolean | array
var ri3 = a3 || a8;         // number    || array is number | array
var ri4 = a4 || a8;         // string    || array is string | array
var ri5 = a5 || a8;         // void      || array is void | array
var ri6 = a6 || a8;         // enum      || array is enum | array
var ri7 = a7 || a8;         // object    || array is object | array
var ri8 = a8 || a8;         // array     || array is array
var ri9 = null || a8;       // null      || array is array
var ri10 = undefined || a8; // undefined || array is array

var rj1 = a1 || null;         // any       || null is any
var rj2 = a2 || null;         // boolean   || null is boolean
var rj3 = a3 || null;         // number    || null is number
var rj4 = a4 || null;         // string    || null is string
var rj5 = a5 || null;         // void      || null is void
var rj6 = a6 || null;         // enum      || null is E
var rj7 = a7 || null;         // object    || null is object
var rj8 = a8 || null;         // array     || null is array
var rj9 = null || null;       // null      || null is any
var rj10 = undefined || null; // undefined || null is any

var rf1 = a1 || undefined;         // any       || undefined is any
var rf2 = a2 || undefined;         // boolean   || undefined is boolean
var rf3 = a3 || undefined;         // number    || undefined is number
var rf4 = a4 || undefined;         // string    || undefined is string
var rf5 = a5 || undefined;         // void      || undefined is void
var rf6 = a6 || undefined;         // enum      || undefined is E
var rf7 = a7 || undefined;         // object    || undefined is object
var rf8 = a8 || undefined;         // array     || undefined is array
var rf9 = null || undefined;       // null      || undefined is any
var rf10 = undefined || undefined; // undefined || undefined is any

//// [logicalOrOperatorWithEveryType.js]
// The || operator permits the operands to be of any type.
// If the || expression is not contextually typed, the right operand is contextually typed
// by the type of the left operand and the result is of the best common type of the two
// operand types.
var E;
(function (E) {
    E[E["a"] = 0] = "a";
    E[E["b"] = 1] = "b";
    E[E["c"] = 2] = "c";
})(E || (E = {}));
var a1;
var a2;
var a3;
var a4;
var a5;
var a6;
var a7;
var a8;
var ra1 = a1 || a1; // any       || any is any
var ra2 = a2 || a1; // boolean   || any is any
var ra3 = a3 || a1; // number    || any is any
var ra4 = a4 || a1; // string    || any is any
var ra5 = a5 || a1; // void      || any is any
var ra6 = a6 || a1; // enum      || any is any
var ra7 = a7 || a1; // object    || any is any
var ra8 = a8 || a1; // array     || any is any
var ra9 = null || a1; // null      || any is any
var ra10 = undefined || a1; // undefined || any is any
var rb1 = a1 || a2; // any       || boolean is any
var rb2 = a2 || a2; // boolean   || boolean is boolean
var rb3 = a3 || a2; // number    || boolean is number | boolean
var rb4 = a4 || a2; // string    || boolean is string | boolean
var rb5 = a5 || a2; // void      || boolean is void | boolean
var rb6 = a6 || a2; // enum      || boolean is E | boolean
var rb7 = a7 || a2; // object    || boolean is object | boolean
var rb8 = a8 || a2; // array     || boolean is array | boolean
var rb9 = null || a2; // null      || boolean is boolean
var rb10 = undefined || a2; // undefined || boolean is boolean
var rc1 = a1 || a3; // any       || number is any
var rc2 = a2 || a3; // boolean   || number is boolean | number
var rc3 = a3 || a3; // number    || number is number
var rc4 = a4 || a3; // string    || number is string | number
var rc5 = a5 || a3; // void      || number is void | number
var rc6 = a6 || a3; // enum      || number is number
var rc7 = a7 || a3; // object    || number is object | number
var rc8 = a8 || a3; // array     || number is array | number
var rc9 = null || a3; // null      || number is number
var rc10 = undefined || a3; // undefined || number is number
var rd1 = a1 || a4; // any       || string is any
var rd2 = a2 || a4; // boolean   || string is boolean | string
var rd3 = a3 || a4; // number    || string is number | string
var rd4 = a4 || a4; // string    || string is string
var rd5 = a5 || a4; // void      || string is void | string
var rd6 = a6 || a4; // enum      || string is enum | string
var rd7 = a7 || a4; // object    || string is object | string
var rd8 = a8 || a4; // array     || string is array | string
var rd9 = null || a4; // null      || string is string
var rd10 = undefined || a4; // undefined || string is string
var re1 = a1 || a5; // any       || void is any
var re2 = a2 || a5; // boolean   || void is boolean | void
var re3 = a3 || a5; // number    || void is number | void
var re4 = a4 || a5; // string    || void is string | void
var re5 = a5 || a5; // void      || void is void
var re6 = a6 || a5; // enum      || void is enum | void
var re7 = a7 || a5; // object    || void is object | void
var re8 = a8 || a5; // array     || void is array | void
var re9 = null || a5; // null      || void is void
var re10 = undefined || a5; // undefined || void is void
var rg1 = a1 || a6; // any       || enum is any
var rg2 = a2 || a6; // boolean   || enum is boolean | enum
var rg3 = a3 || a6; // number    || enum is number
var rg4 = a4 || a6; // string    || enum is string | enum
var rg5 = a5 || a6; // void      || enum is void | enum
var rg6 = a6 || a6; // enum      || enum is E
var rg7 = a7 || a6; // object    || enum is object | enum
var rg8 = a8 || a6; // array     || enum is array | enum
var rg9 = null || a6; // null      || enum is E
var rg10 = undefined || a6; // undefined || enum is E
var rh1 = a1 || a7; // any       || object is any
var rh2 = a2 || a7; // boolean   || object is boolean | object
var rh3 = a3 || a7; // number    || object is number | object
var rh4 = a4 || a7; // string    || object is string | object
var rh5 = a5 || a7; // void      || object is void | object
var rh6 = a6 || a7; // enum      || object is enum | object
var rh7 = a7 || a7; // object    || object is object
var rh8 = a8 || a7; // array     || object is array | object
var rh9 = null || a7; // null      || object is object
var rh10 = undefined || a7; // undefined || object is object
var ri1 = a1 || a8; // any       || array is any
var ri2 = a2 || a8; // boolean   || array is boolean | array
var ri3 = a3 || a8; // number    || array is number | array
var ri4 = a4 || a8; // string    || array is string | array
var ri5 = a5 || a8; // void      || array is void | array
var ri6 = a6 || a8; // enum      || array is enum | array
var ri7 = a7 || a8; // object    || array is object | array
var ri8 = a8 || a8; // array     || array is array
var ri9 = null || a8; // null      || array is array
var ri10 = undefined || a8; // undefined || array is array
var rj1 = a1 || null; // any       || null is any
var rj2 = a2 || null; // boolean   || null is boolean
var rj3 = a3 || null; // number    || null is number
var rj4 = a4 || null; // string    || null is string
var rj5 = a5 || null; // void      || null is void
var rj6 = a6 || null; // enum      || null is E
var rj7 = a7 || null; // object    || null is object
var rj8 = a8 || null; // array     || null is array
var rj9 = null || null; // null      || null is any
var rj10 = undefined || null; // undefined || null is any
var rf1 = a1 || undefined; // any       || undefined is any
var rf2 = a2 || undefined; // boolean   || undefined is boolean
var rf3 = a3 || undefined; // number    || undefined is number
var rf4 = a4 || undefined; // string    || undefined is string
var rf5 = a5 || undefined; // void      || undefined is void
var rf6 = a6 || undefined; // enum      || undefined is E
var rf7 = a7 || undefined; // object    || undefined is object
var rf8 = a8 || undefined; // array     || undefined is array
var rf9 = null || undefined; // null      || undefined is any
var rf10 = undefined || undefined; // undefined || undefined is any
