============ initial translation from Move ================ [variant baseline] public intrinsic fun vector::contains<#0>($t0|v: &vector<#0>, $t1|e: �): bool; [variant baseline] public intrinsic fun vector::index_of<#0>($t0|v: &vector<#0>, $t1|e: �): (bool, u64); [variant baseline] public intrinsic fun vector::append<#0>($t0|lhs: &mut vector<#0>, $t1|other: vector<#0>); [variant baseline] public native fun vector::borrow<#0>($t0|v: &vector<#0>, $t1|i: u64): � [variant baseline] public native fun vector::borrow_mut<#0>($t0|v: &mut vector<#0>, $t1|i: u64): &mut #0; [variant baseline] public native fun vector::destroy_empty<#0>($t0|v: vector<#0>); [variant baseline] public native fun vector::empty<#0>(): vector<#0>; [variant baseline] public intrinsic fun vector::is_empty<#0>($t0|v: &vector<#0>): bool; [variant baseline] public native fun vector::length<#0>($t0|v: &vector<#0>): u64; [variant baseline] public native fun vector::pop_back<#0>($t0|v: &mut vector<#0>): #0; [variant baseline] public native fun vector::push_back<#0>($t0|v: &mut vector<#0>, $t1|e: #0); [variant baseline] public intrinsic fun vector::remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0; [variant baseline] public intrinsic fun vector::reverse<#0>($t0|v: &mut vector<#0>); [variant baseline] public fun vector::singleton<#0>($t0|e: #0): vector<#0> { var $t1|v: vector<#0> var $t2: vector<#0> var $t3: &mut vector<#0> var $t4: #0 var $t5: vector<#0> 0: $t2 := vector::empty<#0>() 1: $t1 := $t2 2: $t3 := borrow_local($t1) 3: $t4 := move($t0) 4: vector::push_back<#0>($t3, $t4) 5: $t5 := move($t1) 6: return $t5 } [variant baseline] public native fun vector::swap<#0>($t0|v: &mut vector<#0>, $t1|i: u64, $t2|j: u64); [variant baseline] public intrinsic fun vector::swap_remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0; [variant baseline] public fun VecEq::leak_index_into_v($t0|g: &mut VecEq::G): &mut u64 { var $t1: &mut VecEq::G var $t2: &mut vector var $t3: u64 var $t4: &mut u64 0: $t1 := move($t0) 1: $t2 := borrow_field.v($t1) 2: $t3 := 0 3: $t4 := vector::borrow_mut($t2, $t3) 4: return $t4 } [variant baseline] public fun VecEq::leak_v($t0|g: &mut VecEq::G): &mut vector { var $t1: &mut VecEq::G var $t2: &mut vector 0: $t1 := move($t0) 1: $t2 := borrow_field.v($t1) 2: return $t2 } [variant baseline] public fun VecEq::new(): VecEq::G { var $t0: u64 var $t1: vector var $t2: VecEq::G 0: $t0 := 10 1: $t1 := vector::singleton($t0) 2: $t2 := pack VecEq::G($t1) 3: return $t2 } ============ after pipeline `escape_analysis` ================ [variant baseline] public intrinsic fun vector::contains<#0>($t0|v: &vector<#0>, $t1|e: �): bool; [variant baseline] public intrinsic fun vector::index_of<#0>($t0|v: &vector<#0>, $t1|e: �): (bool, u64); [variant baseline] public intrinsic fun vector::append<#0>($t0|lhs: &mut vector<#0>, $t1|other: vector<#0>); [variant baseline] public native fun vector::borrow<#0>($t0|v: &vector<#0>, $t1|i: u64): � [variant baseline] public native fun vector::borrow_mut<#0>($t0|v: &mut vector<#0>, $t1|i: u64): &mut #0; [variant baseline] public native fun vector::destroy_empty<#0>($t0|v: vector<#0>); [variant baseline] public native fun vector::empty<#0>(): vector<#0>; [variant baseline] public intrinsic fun vector::is_empty<#0>($t0|v: &vector<#0>): bool; [variant baseline] public native fun vector::length<#0>($t0|v: &vector<#0>): u64; [variant baseline] public native fun vector::pop_back<#0>($t0|v: &mut vector<#0>): #0; [variant baseline] public native fun vector::push_back<#0>($t0|v: &mut vector<#0>, $t1|e: #0); [variant baseline] public intrinsic fun vector::remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0; [variant baseline] public intrinsic fun vector::reverse<#0>($t0|v: &mut vector<#0>); [variant baseline] public fun vector::singleton<#0>($t0|e: #0): vector<#0> { var $t1|v: vector<#0> var $t2: vector<#0> var $t3: &mut vector<#0> var $t4: #0 var $t5: vector<#0> 0: $t2 := vector::empty<#0>() 1: $t1 := $t2 2: $t3 := borrow_local($t1) 3: $t4 := move($t0) 4: vector::push_back<#0>($t3, $t4) 5: $t5 := move($t1) 6: return $t5 } [variant baseline] public native fun vector::swap<#0>($t0|v: &mut vector<#0>, $t1|i: u64, $t2|j: u64); [variant baseline] public intrinsic fun vector::swap_remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0; [variant baseline] public fun VecEq::leak_index_into_v($t0|g: &mut VecEq::G): &mut u64 { var $t1: &mut VecEq::G var $t2: &mut vector var $t3: u64 var $t4: &mut u64 0: $t1 := move($t0) 1: $t2 := borrow_field.v($t1) 2: $t3 := 0 3: $t4 := vector::borrow_mut($t2, $t3) 4: return $t4 } [variant baseline] public fun VecEq::leak_v($t0|g: &mut VecEq::G): &mut vector { var $t1: &mut VecEq::G var $t2: &mut vector 0: $t1 := move($t0) 1: $t2 := borrow_field.v($t1) 2: return $t2 } [variant baseline] public fun VecEq::new(): VecEq::G { var $t0: u64 var $t1: vector var $t2: VecEq::G 0: $t0 := 10 1: $t1 := vector::singleton($t0) 2: $t2 := pack VecEq::G($t1) 3: return $t2 } ============ Diagnostics ================ error: Leaked mutable module-internal reference via return value 0 ┌─ tests/escape_analysis/vec_eq.move:17:5 │ 17 │ ╭ public fun leak_v(g: &mut G): &mut vector { 18 │ │ &mut g.v 19 │ │ } │ ╰─────^ error: Leaked mutable module-internal reference via return value 0 ┌─ tests/escape_analysis/vec_eq.move:22:5 │ 22 │ ╭ public fun leak_index_into_v(g: &mut G): &mut u64 { 23 │ │ vector::borrow_mut(&mut g.v, 0) 24 │ │ } │ ╰─────^