program main
  fn base_i64() -> i64
    call std.num.i32_to_i64
      int 2147483647
  fn widened_i64() -> i64
    binary +
      call base_i64
      i64 1
  fn half_step() -> f64
    binary +
      call std.num.i32_to_f64
        int 5
      float 0.5
  fn wide_as_f64() -> f64
    call std.num.i64_to_f64
      call widened_i64
  fn main() -> i32
    call std.io.print_i64
      call widened_i64
    call std.io.print_f64
      call wide_as_f64
    if
      binary =
        call widened_i64
        i64 2147483648
      int 0
      int 1
  test "i32 widens to i64"
    binary =
      call std.num.i32_to_i64
        int 42
      i64 42
  test "i32 to i64 feeds i64 arithmetic"
    binary =
      call widened_i64
      i64 2147483648
  test "i32 widens to f64"
    binary =
      call std.num.i32_to_f64
        int 42
      float 42
  test "i64 widens to f64"
    binary =
      call wide_as_f64
      float 2147483648
