program main
  fn make_i32_values(base: i32) -> (array i32 3)
    array : (array i32 3)
      var base : i32
      binary + : i32
        var base : i32
        int 1 : i32
      binary + : i32
        var base : i32
        int 2 : i32
  fn make_i64_values(base: i64) -> (array i64 3)
    array : (array i64 3)
      var base : i64
      binary + : i64
        var base : i64
        i64 1 : i64
      binary + : i64
        var base : i64
        i64 2 : i64
  fn make_f64_values(base: f64) -> (array f64 3)
    array : (array f64 3)
      var base : f64
      binary + : f64
        var base : f64
        float 1 : f64
      binary + : f64
        var base : f64
        float 2 : f64
  fn make_flags(first: bool) -> (array bool 3)
    array : (array bool 3)
      var first : bool
      bool false : bool
      bool true : bool
  fn i32_at(values: (array i32 3), i: i32) -> i32
    index : i32
      var values : (array i32 3)
      var i : i32
  fn i64_at(values: (array i64 3), i: i32) -> i64
    index : i64
      var values : (array i64 3)
      var i : i32
  fn f64_at(values: (array f64 3), i: i32) -> f64
    index : f64
      var values : (array f64 3)
      var i : i32
  fn bool_at(values: (array bool 3), i: i32) -> bool
    index : bool
      var values : (array bool 3)
      var i : i32
  fn i64_local_array_flow(i: i32) -> i64
    local let values : unit
      call make_i64_values : (array i64 3)
        i64 40 : i64
    call i64_at : i64
      var values : (array i64 3)
      var i : i32
  fn f64_parameter_local_copy(values: (array f64 3), i: i32) -> f64
    local let copy : unit
      var values : (array f64 3)
    index : f64
      var copy : (array f64 3)
      var i : i32
  fn echo_flags(values: (array bool 3)) -> (array bool 3)
    var values : (array bool 3)
  fn bool_call_return_index(i: i32) -> bool
    index : bool
      call make_flags : (array bool 3)
        bool true : bool
      var i : i32
  fn main() -> i32
    if : i32
      call bool_call_return_index : bool
        int 0 : i32
      int 0 : i32
      int 1 : i32
  test "i32 array parameter value flow"
    binary = : bool
      call i32_at : i32
        call make_i32_values : (array i32 3)
          int 7 : i32
        int 0 : i32
      int 7 : i32
  test "i64 array local call value flow"
    binary = : bool
      call i64_local_array_flow : i64
        int 2 : i32
      i64 42 : i64
  test "f64 array parameter local copy"
    binary = : bool
      call f64_parameter_local_copy : f64
        call make_f64_values : (array f64 3)
          float 4 : f64
        int 1 : i32
      float 5 : f64
  test "bool array dynamic index"
    call bool_at : bool
      call make_flags : (array bool 3)
        bool true : bool
      int 2 : i32
  test "bool array return call value flow"
    index : bool
      call echo_flags : (array bool 3)
        call make_flags : (array bool 3)
          bool false : bool
      int 2 : i32
