program main
  fn add_local(a: i32) -> i32
    local let one : unit
      int 1 : i32
    local var total : unit
      binary + : i32
        var a : i32
        var one : i32
    set total : unit
      binary + : i32
        var total : i32
        int 1 : i32
    var total : i32
  fn keep_flag(flag: bool) -> bool
    local let local_flag : unit
      var flag : bool
    var local_flag : bool
  fn flip_flag(flag: bool) -> bool
    local var current : unit
      var flag : bool
    set current : unit
      if : bool
        var current : bool
        bool false : bool
        bool true : bool
    var current : bool
  fn add_wide_local(base: i64) -> i64
    local var count : unit
      var base : i64
    set count : unit
      binary + : i64
        var count : i64
        i64 2 : i64
    var count : i64
  fn add_ratio_local(base: f64) -> f64
    local var amount : unit
      var base : f64
    set amount : unit
      binary + : f64
        var amount : f64
        float 0.5 : f64
    var amount : f64
  fn main() -> i32
    local var flag : unit
      bool false : bool
    set flag : unit
      call flip_flag : bool
        var flag : bool
    if : i32
      var flag : bool
      call add_local : i32
        int 2 : i32
      int 1 : i32
  test "locals work"
    local let base : unit
      int 2 : i32
    local var value : unit
      call add_local : i32
        var base : i32
    set value : unit
      binary + : i32
        var value : i32
        int 1 : i32
    binary = : bool
      var value : i32
      int 5 : i32
  test "bool let locals work"
    local let expected : unit
      bool true : bool
    local let actual : unit
      call keep_flag : bool
        var expected : bool
    var actual : bool
  test "bool let locals preserve false"
    if : bool
      call keep_flag : bool
        bool false : bool
      bool false : bool
      bool true : bool
  test "bool var set flips true"
    if : bool
      call flip_flag : bool
        bool true : bool
      bool false : bool
      bool true : bool
  test "bool var set flips false"
    call flip_flag : bool
      bool false : bool
  test "i64 var set works"
    binary = : bool
      call add_wide_local : i64
        i64 40 : i64
      i64 42 : i64
  test "f64 var set works"
    binary = : bool
      call add_ratio_local : f64
        float 41.5 : f64
      float 42 : f64
