program main
  fn make_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 first(values: (array i32 3)) -> i32
    index : i32
      var values : (array i32 3)
      int 0 : i32
  fn at(values: (array i32 3), i: i32) -> i32
    index : i32
      var values : (array i32 3)
      var i : i32
  fn echo(values: (array i32 3)) -> (array i32 3)
    var values : (array i32 3)
  fn call_return_index(i: i32) -> i32
    index : i32
      call make_values : (array i32 3)
        int 10 : i32
      var i : i32
  fn local_array_flow(i: i32) -> i32
    local let values : unit
      call make_values : (array i32 3)
        int 20 : i32
    call at : i32
      var values : (array i32 3)
      var i : i32
  fn parameter_local_copy(values: (array i32 3), i: i32) -> i32
    local let copy : unit
      var values : (array i32 3)
    index : i32
      var copy : (array i32 3)
      var i : i32
  fn main() -> i32
    call call_return_index : i32
      int 1 : i32
  test "array parameter value flow"
    binary = : bool
      call first : i32
        call make_values : (array i32 3)
          int 7 : i32
      int 7 : i32
  test "array dynamic index"
    binary = : bool
      call at : i32
        call make_values : (array i32 3)
          int 4 : i32
        int 2 : i32
      int 6 : i32
  test "array local call value flow"
    binary = : bool
      call local_array_flow : i32
        int 1 : i32
      int 21 : i32
  test "array parameter local copy"
    binary = : bool
      call parameter_local_copy : i32
        call make_values : (array i32 3)
          int 40 : i32
        int 2 : i32
      int 42 : i32
  test "array return call value flow"
    binary = : bool
      index : i32
        call echo : (array i32 3)
          call make_values : (array i32 3)
            int 30 : i32
        int 2 : i32
      int 32 : i32
