// @target: es2015
// @strictNullChecks: true

class Foo {
    x: string = "";
}

declare function getFooOrNull(): Foo | null;
declare function getStringOrNumberOrNull(): string | number | null;

function f1() {
    let foo: Foo | null;
    if ((foo = getFooOrNull()) !== null) {
        foo;  // Foo
    }
}

function f2() {
    let foo1: Foo | null;
    let foo2: Foo | null;
    if ((foo1 = getFooOrNull(), foo2 = foo1) !== null) {
        foo1;  // Foo | null
        foo2;  // Foo
    }
}

function f3() {
    let obj: Object | null;
    if ((obj = getFooOrNull()) instanceof Foo) {
        obj;
    }
}

function f4() {
    let x: string | number | null;
    if (typeof (x = getStringOrNumberOrNull()) === "number") {
        x;
    }
}

// Repro from #8851

const re = /./g
let match: RegExpExecArray | null

while ((match = re.exec("xxx")) != null) {
    const length = match[1].length + match[2].length
}