============ 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.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.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.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($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.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.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.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($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 │ │ } │ ╰─────^