/**
 * @flow
 */
function foo(x : mixed): string {
    var a: number | string = "";
    var b: number | string = "";

    switch (x) {
      case "foo":
        a = 0;
      default:
        b = 0;
    }

    // a is now string | number
    (a : string); // error, string | number ~/> string
    (a : number); // error, string | number ~/> number

    // b is now number
    (b : number); // ok
    return b; // error, number ~/> string
}

function baz(x: mixed): number {
    var a: number | string = "";
    var b: number | string = "";

    switch (x) {
      case "baz":
        a = 0;
        break;
      case "bar":
        a = "";
      default:
        b = 0;
    }

    // a is now string | number
    (a : string); // error, string | number ~/> string
    (a : number); // error, string | number ~/> number

    // b is now string | number
    (b : string); // error, string | number ~/> string
    (b : number); // error, string | number ~/> number

    return a+b; // error, string ~/> number
}
