// @target: es2015
// @noImplicitAny: true

let cond: boolean;

function len(s: string) {
    return s.length;
}

function f1() {
    let x: string | number | boolean;
    x = "";
    while (cond) {
        x = len(x);
        x;
    }
    x;
}

function f2() {
    let x: string | number | boolean;
    x = "";
    while (cond) {
        x;
        x = len(x);
    }
    x;
}

declare function foo(x: string): number;
declare function foo(x: number): string;

function g1() {
    let x: string | number | boolean;
    x = "";
    while (cond) {
        x = foo(x);
        x;
    }
    x;
}

function g2() {
    let x: string | number | boolean;
    x = "";
    while (cond) {
        x;
        x = foo(x);
    }
    x;
}

function asNumber(x: string | number): number {
    return +x;
}

function h1() {
    let x: string | number | boolean;
    x = "0";
    while (cond) {
        x = +x + 1;
        x;
    }
}

function h2() {
    let x: string | number | boolean;
    x = "0";
    while (cond) {
        x = asNumber(x) + 1;
        x;
    }
}

function h3() {
    let x: string | number | boolean;
    x = "0";
    while (cond) {
        let y = asNumber(x);
        x = y + 1;
        x;
    }
}

function h4() {
    let x: string | number | boolean;
    x = "0";
    while (cond) {
        x;
        let y = asNumber(x);
        x = y + 1;
        x;
    }
}
