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