============ 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] fun ReturnRefsIntoVec::return_vec_index_immut($t0|v: &vector): &u64 { var $t1: &vector var $t2: u64 var $t3: &u64 0: $t1 := move($t0) 1: $t2 := 0 2: $t3 := vector::borrow($t1, $t2) 3: return $t3 } [variant baseline] fun ReturnRefsIntoVec::return_vec_index_mut($t0|v: &mut vector): &mut u64 { var $t1: &mut vector var $t2: u64 var $t3: &mut u64 0: $t1 := move($t0) 1: $t2 := 0 2: $t3 := vector::borrow_mut($t1, $t2) 3: return $t3 } ============ 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] fun ReturnRefsIntoVec::return_vec_index_immut($t0|v: &vector): &u64 { var $t1: &vector var $t2: u64 var $t3: &u64 0: $t1 := move($t0) 1: $t2 := 0 2: $t3 := vector::borrow($t1, $t2) 3: return $t3 } [variant baseline] fun ReturnRefsIntoVec::return_vec_index_mut($t0|v: &mut vector): &mut u64 { var $t1: &mut vector var $t2: u64 var $t3: &mut u64 0: $t1 := move($t0) 1: $t2 := 0 2: $t3 := vector::borrow_mut($t1, $t2) 3: return $t3 } ============ Diagnostics ================ error: Leaked mutable module-internal reference via return value 0 ┌─ tests/escape_analysis/return_refs_into_vec.move:12:5 │ 12 │ ╭ fun return_vec_index_mut(v: &mut vector): &mut u64 { 13 │ │ vector::borrow_mut(v, 0) 14 │ │ } │ ╰─────^ warning: Leaked immutable module-internal reference via return value 0 ┌─ tests/escape_analysis/return_refs_into_vec.move:7:5 │ 7 │ ╭ fun return_vec_index_immut(v: &vector): &u64 { 8 │ │ vector::borrow(v, 0) 9 │ │ } │ ╰─────^