move-stackless-bytecode 0.3.2

Move stackless bytecode
Documentation
============ initial translation from Move ================

[variant baseline]
public fun StructSpecRelevance::create($t0|i: u64, $t1|j: u64): StructSpecRelevance::Nonzero {
     var $t2: u64
     var $t3: u64
     var $t4: bool
     var $t5: u64
     var $t6: u64
     var $t7: u64
     var $t8: StructSpecRelevance::Nonzero
  0: $t2 := copy($t0)
  1: $t3 := 0
  2: $t4 := >($t2, $t3)
  3: if ($t4) goto 7 else goto 4
  4: label L1
  5: $t5 := 0
  6: abort($t5)
  7: label L0
  8: $t6 := move($t0)
  9: $t7 := move($t1)
 10: $t8 := pack StructSpecRelevance::Nonzero($t6, $t7)
 11: return $t8
}


[variant baseline]
public fun StructSpecRelevance::leak_i_bad($t0|n: &mut StructSpecRelevance::Nonzero): &mut u64 {
     var $t1: &mut StructSpecRelevance::Nonzero
     var $t2: &mut u64
  0: $t1 := move($t0)
  1: $t2 := borrow_field<StructSpecRelevance::Nonzero>.i($t1)
  2: return $t2
}


[variant baseline]
public fun StructSpecRelevance::leak_j_ok($t0|n: &mut StructSpecRelevance::Nonzero): &mut u64 {
     var $t1: &mut StructSpecRelevance::Nonzero
     var $t2: &mut u64
  0: $t1 := move($t0)
  1: $t2 := borrow_field<StructSpecRelevance::Nonzero>.j($t1)
  2: return $t2
}

============ after pipeline `escape_analysis` ================

[variant baseline]
public fun StructSpecRelevance::create($t0|i: u64, $t1|j: u64): StructSpecRelevance::Nonzero {
     var $t2: u64
     var $t3: u64
     var $t4: bool
     var $t5: u64
     var $t6: u64
     var $t7: u64
     var $t8: StructSpecRelevance::Nonzero
  0: $t2 := copy($t0)
  1: $t3 := 0
  2: $t4 := >($t2, $t3)
  3: if ($t4) goto 7 else goto 4
  4: label L1
  5: $t5 := 0
  6: abort($t5)
  7: label L0
  8: $t6 := move($t0)
  9: $t7 := move($t1)
 10: $t8 := pack StructSpecRelevance::Nonzero($t6, $t7)
 11: return $t8
}


[variant baseline]
public fun StructSpecRelevance::leak_i_bad($t0|n: &mut StructSpecRelevance::Nonzero): &mut u64 {
     var $t1: &mut StructSpecRelevance::Nonzero
     var $t2: &mut u64
  0: $t1 := move($t0)
  1: $t2 := borrow_field<StructSpecRelevance::Nonzero>.i($t1)
  2: return $t2
}


[variant baseline]
public fun StructSpecRelevance::leak_j_ok($t0|n: &mut StructSpecRelevance::Nonzero): &mut u64 {
     var $t1: &mut StructSpecRelevance::Nonzero
     var $t2: &mut u64
  0: $t1 := move($t0)
  1: $t2 := borrow_field<StructSpecRelevance::Nonzero>.j($t1)
  2: return $t2
}

============ Diagnostics ================
error: Leaked mutable module-internal reference via return value 0
   ┌─ tests/escape_analysis/struct_spec_relevance.move:14:5
   │
14 │ ╭     public fun leak_j_ok(n: &mut Nonzero): &mut u64 {
15 │ │         &mut n.j
16 │ │     }
   │ ╰─────^

error: Leaked mutable module-internal reference via return value 0
   ┌─ tests/escape_analysis/struct_spec_relevance.move:9:5
   │
 9 │ ╭     public fun leak_i_bad(n: &mut Nonzero): &mut u64 {
10 │ │         &mut n.i
11 │ │     }
   │ ╰─────^