============ 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 MultiLayerCalling::inner($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector { var $t1: &mut MultiLayerCalling::HasVector var $t2: &mut vector var $t3: u64 var $t4: &mut MultiLayerCalling::HasAnotherVector 0: $t1 := move($t0) 1: $t2 := borrow_field.v($t1) 2: $t3 := 7 3: $t4 := vector::borrow_mut($t2, $t3) 4: return $t4 } [variant baseline] fun MultiLayerCalling::mid($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector { var $t1: &mut MultiLayerCalling::HasVector var $t2: &mut MultiLayerCalling::HasAnotherVector 0: $t1 := move($t0) 1: $t2 := MultiLayerCalling::inner($t1) 2: return $t2 } [variant baseline] fun MultiLayerCalling::outer($t0|has_vector: &mut MultiLayerCalling::HasVector) { var $t1|has_another_vector: &mut MultiLayerCalling::HasAnotherVector var $t2: &mut MultiLayerCalling::HasVector var $t3: &mut MultiLayerCalling::HasAnotherVector var $t4: &mut MultiLayerCalling::HasAnotherVector var $t5: &mut vector var $t6: u8 0: $t2 := move($t0) 1: $t3 := MultiLayerCalling::mid($t2) 2: $t1 := $t3 3: $t4 := move($t1) 4: $t5 := borrow_field.v($t4) 5: $t6 := 42 6: vector::push_back($t5, $t6) 7: return () } ============ after pipeline `borrow` ================ [variant baseline] public intrinsic fun vector::contains<#0>($t0|v: vector<#0>, $t1|e: #0): bool; [variant baseline] public intrinsic fun vector::index_of<#0>($t0|v: vector<#0>, $t1|e: #0): (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): #0; [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: &mut vector<#0> var $t3: vector<#0> # live_nodes: LocalRoot($t0) 0: $t1 := vector::empty<#0>() # live_nodes: LocalRoot($t0) 1: $t2 := borrow_local($t1) # live_nodes: LocalRoot($t0), Reference($t2) # borrowed_by: LocalRoot($t1) -> {(@, Reference($t2))} # borrows_from: Reference($t2) -> {(@, LocalRoot($t1))} 2: vector::push_back<#0>($t2, $t0) # live_nodes: LocalRoot($t0) # borrowed_by: LocalRoot($t1) -> {(@, Reference($t2))} # borrows_from: Reference($t2) -> {(@, LocalRoot($t1))} 3: $t3 := move($t1) # live_nodes: LocalRoot($t0), LocalRoot($t3) # borrowed_by: LocalRoot($t1) -> {(@, Reference($t2))} # borrows_from: Reference($t2) -> {(@, LocalRoot($t1))} 4: return $t3 } [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 MultiLayerCalling::inner($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector { var $t1: &mut vector var $t2: u64 var $t3: &mut MultiLayerCalling::HasAnotherVector # live_nodes: Reference($t0) 0: $t1 := borrow_field.v($t0) # live_nodes: Reference($t0), Reference($t1) # borrowed_by: Reference($t0) -> {(.v (vector), Reference($t1))} # borrows_from: Reference($t1) -> {(.v (vector), Reference($t0))} 1: $t2 := 7 # live_nodes: Reference($t0), Reference($t1) # borrowed_by: Reference($t0) -> {(.v (vector), Reference($t1))} # borrows_from: Reference($t1) -> {(.v (vector), Reference($t0))} 2: $t3 := vector::borrow_mut($t1, $t2) # live_nodes: Reference($t0), Reference($t3) # borrowed_by: Reference($t0) -> {(.v (vector), Reference($t1))}, Reference($t1) -> {([], Reference($t3))} # borrows_from: Reference($t1) -> {(.v (vector), Reference($t0))}, Reference($t3) -> {([], Reference($t1))} 3: trace_local[has_vector]($t0) # live_nodes: Reference($t3) # borrowed_by: Reference($t0) -> {(.v (vector), Reference($t1))}, Reference($t1) -> {([], Reference($t3))} # borrows_from: Reference($t1) -> {(.v (vector), Reference($t0))}, Reference($t3) -> {([], Reference($t1))} 4: return $t3 } [variant baseline] fun MultiLayerCalling::mid($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector { var $t1: &mut MultiLayerCalling::HasAnotherVector # live_nodes: Reference($t0) 0: $t1 := MultiLayerCalling::inner($t0) # live_nodes: Reference($t0), Reference($t1) # borrowed_by: Reference($t0) -> {(.v (vector)/[], Reference($t1))} # borrows_from: Reference($t1) -> {(.v (vector)/[], Reference($t0))} 1: trace_local[has_vector]($t0) # live_nodes: Reference($t1) # borrowed_by: Reference($t0) -> {(.v (vector)/[], Reference($t1))} # borrows_from: Reference($t1) -> {(.v (vector)/[], Reference($t0))} 2: return $t1 } [variant baseline] fun MultiLayerCalling::outer($t0|has_vector: &mut MultiLayerCalling::HasVector) { var $t1|has_another_vector: &mut MultiLayerCalling::HasAnotherVector var $t2: &mut MultiLayerCalling::HasAnotherVector var $t3: &mut vector var $t4: u8 # live_nodes: Reference($t0) 0: $t2 := MultiLayerCalling::mid($t0) # live_nodes: Reference($t0), Reference($t2) # borrowed_by: Reference($t0) -> {(.v (vector)/[], Reference($t2))} # borrows_from: Reference($t2) -> {(.v (vector)/[], Reference($t0))} 1: $t3 := borrow_field.v($t2) # live_nodes: Reference($t0), Reference($t3) # borrowed_by: Reference($t0) -> {(.v (vector)/[], Reference($t2))}, Reference($t2) -> {(.v (vector), Reference($t3))} # borrows_from: Reference($t2) -> {(.v (vector)/[], Reference($t0))}, Reference($t3) -> {(.v (vector), Reference($t2))} 2: $t4 := 42 # live_nodes: Reference($t0), Reference($t3) # borrowed_by: Reference($t0) -> {(.v (vector)/[], Reference($t2))}, Reference($t2) -> {(.v (vector), Reference($t3))} # borrows_from: Reference($t2) -> {(.v (vector)/[], Reference($t0))}, Reference($t3) -> {(.v (vector), Reference($t2))} 3: vector::push_back($t3, $t4) # live_nodes: Reference($t0) # borrowed_by: Reference($t0) -> {(.v (vector)/[], Reference($t2))}, Reference($t2) -> {(.v (vector), Reference($t3))} # borrows_from: Reference($t2) -> {(.v (vector)/[], Reference($t0))}, Reference($t3) -> {(.v (vector), Reference($t2))} 4: trace_local[has_vector]($t0) # borrowed_by: Reference($t0) -> {(.v (vector)/[], Reference($t2))}, Reference($t2) -> {(.v (vector), Reference($t3))} # borrows_from: Reference($t2) -> {(.v (vector)/[], Reference($t0))}, Reference($t3) -> {(.v (vector), Reference($t2))} 5: return () } ==== borrow analysis summaries ==== fun vector::borrow_mut[baseline] borrowed_by: Reference($t0) -> {([], Return(0))} borrows_from: Return(0) -> {([], Reference($t0))} fun MultiLayerCalling::inner[baseline] borrowed_by: Reference($t0) -> {(.v (vector)/[], Return(0))} borrows_from: Return(0) -> {(.v (vector)/[], Reference($t0))} fun MultiLayerCalling::mid[baseline] borrowed_by: Reference($t0) -> {(.v (vector)/[], Return(0))} borrows_from: Return(0) -> {(.v (vector)/[], Reference($t0))}