move-stackless-bytecode 0.3.2

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

[variant baseline]
public fun GlobalSpecRelevance::create($t0|i: u64, $t1|j: u64): GlobalSpecRelevance::Nonzero {
     var $t2: u64
     var $t3: u64
     var $t4: GlobalSpecRelevance::Nonzero
  0: $t2 := move($t0)
  1: $t3 := move($t1)
  2: $t4 := pack GlobalSpecRelevance::Nonzero($t2, $t3)
  3: return $t4
}


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


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


[variant baseline]
public fun GlobalSpecRelevance::publish($t0|account: &signer, $t1|n: GlobalSpecRelevance::Nonzero) {
     var $t2: &GlobalSpecRelevance::Nonzero
     var $t3: &u64
     var $t4: u64
     var $t5: u64
     var $t6: bool
     var $t7: &signer
     var $t8: u64
     var $t9: &signer
     var $t10: GlobalSpecRelevance::Nonzero
  0: $t2 := borrow_local($t1)
  1: $t3 := borrow_field<GlobalSpecRelevance::Nonzero>.i($t2)
  2: $t4 := read_ref($t3)
  3: $t5 := 0
  4: $t6 := >($t4, $t5)
  5: if ($t6) goto 11 else goto 6
  6: label L1
  7: $t7 := move($t0)
  8: destroy($t7)
  9: $t8 := 0
 10: abort($t8)
 11: label L0
 12: $t9 := move($t0)
 13: $t10 := move($t1)
 14: move_to<GlobalSpecRelevance::Nonzero>($t10, $t9)
 15: return ()
}

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

[variant baseline]
public fun GlobalSpecRelevance::create($t0|i: u64, $t1|j: u64): GlobalSpecRelevance::Nonzero {
     var $t2: u64
     var $t3: u64
     var $t4: GlobalSpecRelevance::Nonzero
  0: $t2 := move($t0)
  1: $t3 := move($t1)
  2: $t4 := pack GlobalSpecRelevance::Nonzero($t2, $t3)
  3: return $t4
}


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


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


[variant baseline]
public fun GlobalSpecRelevance::publish($t0|account: &signer, $t1|n: GlobalSpecRelevance::Nonzero) {
     var $t2: &GlobalSpecRelevance::Nonzero
     var $t3: &u64
     var $t4: u64
     var $t5: u64
     var $t6: bool
     var $t7: &signer
     var $t8: u64
     var $t9: &signer
     var $t10: GlobalSpecRelevance::Nonzero
  0: $t2 := borrow_local($t1)
  1: $t3 := borrow_field<GlobalSpecRelevance::Nonzero>.i($t2)
  2: $t4 := read_ref($t3)
  3: $t5 := 0
  4: $t6 := >($t4, $t5)
  5: if ($t6) goto 11 else goto 6
  6: label L1
  7: $t7 := move($t0)
  8: destroy($t7)
  9: $t8 := 0
 10: abort($t8)
 11: label L0
 12: $t9 := move($t0)
 13: $t10 := move($t1)
 14: move_to<GlobalSpecRelevance::Nonzero>($t10, $t9)
 15: return ()
}

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

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