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