function block_scope(x: string | number) {
  {
    let x;
    x = ""; // doesn't refine outer x
  }
  x as string; // error: number ~> string
}

function switch_scope(x: string | number) {
  switch (x) {
    default:
      let x;
      x = ""; // doesn't refine outer x
  }
  x as string; // error: number ~> string
}

function try_scope(x: string | number) {
  try {
    let x;
    x = ""; // doesn't refine outer x
  } catch (e) {
    x = ""; // refinement would only escape if both sides refined
  }
  x as string; // error: number ~> string
}

function try_scope_catch(x: string | number) {
  try {
    x = ""; // refinement would only escape if both sides refined
  } catch (e) {
    let x;
    x = ""; // doesn't refine outer x
  }
  x as string; // error: number ~> string
}
