// @target: es2015
// If one operand is the null or undefined value, it is treated as having the type of the
// other operand.

declare var a: boolean;
declare var b: string;
declare var c: Object;

// operator *
var r1a1 = null * a;
var r1a2 = null * b;
var r1a3 = null * c;

var r1b1 = a * null;
var r1b2 = b * null;
var r1b3 = c * null;

var r1c1 = null * true;
var r1c2 = null * '';
var r1c3 = null * {};

var r1d1 = true * null;
var r1d2 = '' * null;
var r1d3 = {} * null;

// operator /
var r2a1 = null / a;
var r2a2 = null / b;
var r2a3 = null / c;

var r2b1 = a / null;
var r2b2 = b / null;
var r2b3 = c / null;

var r2c1 = null / true;
var r2c2 = null / '';
var r2c3 = null / {};

var r2d1 = true / null;
var r2d2 = '' / null;
var r2d3 = {} / null;

// operator %
var r3a1 = null % a;
var r3a2 = null % b;
var r3a3 = null % c;

var r3b1 = a % null;
var r3b2 = b % null;
var r3b3 = c % null;

var r3c1 = null % true;
var r3c2 = null % '';
var r3c3 = null % {};

var r3d1 = true % null;
var r3d2 = '' % null;
var r3d3 = {} % null;

// operator -
var r4a1 = null - a;
var r4a2 = null - b;
var r4a3 = null - c;

var r4b1 = a - null;
var r4b2 = b - null;
var r4b3 = c - null;

var r4c1 = null - true;
var r4c2 = null - '';
var r4c3 = null - {};

var r4d1 = true - null;
var r4d2 = '' - null;
var r4d3 = {} - null;

// operator <<
var r5a1 = null << a;
var r5a2 = null << b;
var r5a3 = null << c;

var r5b1 = a << null;
var r5b2 = b << null;
var r5b3 = c << null;

var r5c1 = null << true;
var r5c2 = null << '';
var r5c3 = null << {};

var r5d1 = true << null;
var r5d2 = '' << null;
var r5d3 = {} << null;

// operator >>
var r6a1 = null >> a;
var r6a2 = null >> b;
var r6a3 = null >> c;

var r6b1 = a >> null;
var r6b2 = b >> null;
var r6b3 = c >> null;

var r6c1 = null >> true;
var r6c2 = null >> '';
var r6c3 = null >> {};

var r6d1 = true >> null;
var r6d2 = '' >> null;
var r6d3 = {} >> null;

// operator >>>
var r7a1 = null >>> a;
var r7a2 = null >>> b;
var r7a3 = null >>> c;

var r7b1 = a >>> null;
var r7b2 = b >>> null;
var r7b3 = c >>> null;

var r7c1 = null >>> true;
var r7c2 = null >>> '';
var r7c3 = null >>> {};

var r7d1 = true >>> null;
var r7d2 = '' >>> null;
var r7d3 = {} >>> null;

// operator &
var r8a1 = null & a;
var r8a2 = null & b;
var r8a3 = null & c;

var r8b1 = a & null;
var r8b2 = b & null;
var r8b3 = c & null;

var r8c1 = null & true;
var r8c2 = null & '';
var r8c3 = null & {};

var r8d1 = true & null;
var r8d2 = '' & null;
var r8d3 = {} & null;

// operator ^
var r9a1 = null ^ a;
var r9a2 = null ^ b;
var r9a3 = null ^ c;

var r9b1 = a ^ null;
var r9b2 = b ^ null;
var r9b3 = c ^ null;

var r9c1 = null ^ true;
var r9c2 = null ^ '';
var r9c3 = null ^ {};

var r9d1 = true ^ null;
var r9d2 = '' ^ null;
var r9d3 = {} ^ null;

// operator |
var r10a1 = null | a;
var r10a2 = null | b;
var r10a3 = null | c;

var r10b1 = a | null;
var r10b2 = b | null;
var r10b3 = c | null;

var r10c1 = null | true;
var r10c2 = null | '';
var r10c3 = null | {};

var r10d1 = true | null;
var r10d2 = '' | null;
var r10d3 = {} | null;