============ initial translation from Move ================ [variant baseline] public fun Test::test_borrow_imm<#0>(): u64 { var $t0|r: &Test::R<#0> var $t1: address var $t2: &Test::R<#0> var $t3: &Test::R<#0> var $t4: &u64 var $t5: u64 0: $t1 := 0x1 1: $t2 := borrow_global>($t1) 2: $t0 := $t2 3: $t3 := move($t0) 4: $t4 := borrow_field>.x($t3) 5: $t5 := read_ref($t4) 6: return $t5 } [variant baseline] public fun Test::test_borrow_mut<#0>(): u64 { var $t0|r: &mut Test::R<#0> var $t1: address var $t2: &mut Test::R<#0> var $t3: u64 var $t4: &mut Test::R<#0> var $t5: &mut Test::S var $t6: &mut u64 var $t7: u64 var $t8: &mut Test::R<#0> var $t9: &mut u64 var $t10: &mut Test::R<#0> var $t11: &u64 var $t12: u64 0: $t1 := 0x1 1: $t2 := borrow_global>($t1) 2: $t0 := $t2 3: $t3 := 2 4: $t4 := copy($t0) 5: $t5 := borrow_field>.s($t4) 6: $t6 := borrow_field.y($t5) 7: write_ref($t6, $t3) 8: $t7 := 3 9: $t8 := copy($t0) 10: $t9 := borrow_field>.x($t8) 11: write_ref($t9, $t7) 12: $t10 := move($t0) 13: $t11 := borrow_field>.x($t10) 14: $t12 := read_ref($t11) 15: return $t12 } [variant baseline] public fun Test::test_borrow_mut_local(): Test::R { var $t0|d: Test::R var $t1|r: &mut Test::R var $t2: u64 var $t3: u64 var $t4: Test::S var $t5: u64 var $t6: Test::R var $t7: &mut Test::R var $t8: u64 var $t9: &mut Test::R var $t10: &mut Test::S var $t11: &mut u64 var $t12: u64 var $t13: &mut Test::R var $t14: &mut u64 var $t15: Test::R 0: $t2 := 2 1: $t3 := 1 2: $t4 := pack Test::S($t3) 3: $t5 := 0 4: $t6 := pack Test::R($t2, $t4, $t5) 5: $t0 := $t6 6: $t7 := borrow_local($t0) 7: $t1 := $t7 8: $t8 := 2 9: $t9 := copy($t1) 10: $t10 := borrow_field>.s($t9) 11: $t11 := borrow_field.y($t10) 12: write_ref($t11, $t8) 13: $t12 := 3 14: $t13 := move($t1) 15: $t14 := borrow_field>.x($t13) 16: write_ref($t14, $t12) 17: $t15 := move($t0) 18: return $t15 } ============ after pipeline `data_invariant_instrumentation` ================ [variant verification] public fun Test::test_borrow_imm<#0>(): u64 { var $t0|r: Test::R<#0> var $t1: address var $t2: Test::R<#0> var $t3: num var $t4: u64 0: assume forall $rsc: ResourceDomain>(): And(WellFormed($rsc), And(Gt(select Test::R.x($rsc), select Test::S.y(select Test::R.s($rsc))), Gt(select Test::S.y(select Test::R.s($rsc)), 0))) 1: $t1 := 0x1 2: $t2 := get_global>($t1) on_abort goto 6 with $t3 3: $t4 := get_field>.x($t2) 4: label L1 5: return $t4 6: label L2 7: abort($t3) } [variant verification] public fun Test::test_borrow_mut<#0>(): u64 { var $t0|r: &mut Test::R<#0> var $t1: address var $t2: &mut Test::R<#0> var $t3: num var $t4: u64 var $t5: &mut Test::S var $t6: &mut u64 var $t7: u64 var $t8: &mut u64 var $t9: u64 0: assume forall $rsc: ResourceDomain>(): And(WellFormed($rsc), And(Gt(select Test::R.x($rsc), select Test::S.y(select Test::R.s($rsc))), Gt(select Test::S.y(select Test::R.s($rsc)), 0))) 1: $t1 := 0x1 2: $t2 := borrow_global>($t1) on_abort goto 19 with $t3 3: $t4 := 2 4: $t5 := borrow_field>.s($t2) 5: $t6 := borrow_field.y($t5) 6: write_ref($t6, $t4) 7: write_back[Reference($t5).y (u64)]($t6) 8: write_back[Reference($t2).s (Test::S)]($t5) 9: $t7 := 3 10: $t8 := borrow_field>.x($t2) 11: write_ref($t8, $t7) 12: write_back[Reference($t2).x (u64)]($t8) 13: $t9 := get_field>.x($t2) # data invariant at tests/data_invariant_instrumentation/borrow.move:13:9+18 # VC: data invariant does not hold at tests/data_invariant_instrumentation/borrow.move:13:9+18 14: assert Gt(select Test::R.x($t2), select Test::S.y(select Test::R.s($t2))) # data invariant at tests/data_invariant_instrumentation/borrow.move:17:9+16 # VC: data invariant does not hold at tests/data_invariant_instrumentation/borrow.move:17:9+16 15: assert Gt(select Test::S.y(select Test::R.s($t2)), 0) 16: write_back[Test::R<#0>@]($t2) 17: label L1 18: return $t9 19: label L2 20: abort($t3) } [variant verification] public fun Test::test_borrow_mut_local(): Test::R { var $t0|d: Test::R var $t1|r: &mut Test::R var $t2: u64 var $t3: u64 var $t4: Test::S var $t5: u64 var $t6: &mut Test::R var $t7: u64 var $t8: &mut Test::S var $t9: &mut u64 var $t10: u64 var $t11: &mut u64 var $t12: Test::R 0: $t2 := 2 1: $t3 := 1 2: $t4 := pack Test::S($t3) # data invariant at tests/data_invariant_instrumentation/borrow.move:17:9+16 # VC: data invariant does not hold at tests/data_invariant_instrumentation/borrow.move:17:9+16 3: assert Gt(select Test::S.y($t4), 0) 4: $t5 := 0 5: $t0 := pack Test::R($t2, $t4, $t5) # data invariant at tests/data_invariant_instrumentation/borrow.move:13:9+18 # VC: data invariant does not hold at tests/data_invariant_instrumentation/borrow.move:13:9+18 6: assert Gt(select Test::R.x($t0), select Test::S.y(select Test::R.s($t0))) 7: $t6 := borrow_local($t0) 8: $t7 := 2 9: $t8 := borrow_field>.s($t6) 10: $t9 := borrow_field.y($t8) 11: write_ref($t9, $t7) 12: write_back[Reference($t8).y (u64)]($t9) 13: write_back[Reference($t6).s (Test::S)]($t8) 14: $t10 := 3 15: $t11 := borrow_field>.x($t6) 16: write_ref($t11, $t10) 17: write_back[Reference($t6).x (u64)]($t11) # data invariant at tests/data_invariant_instrumentation/borrow.move:13:9+18 # VC: data invariant does not hold at tests/data_invariant_instrumentation/borrow.move:13:9+18 18: assert Gt(select Test::R.x($t6), select Test::S.y(select Test::R.s($t6))) # data invariant at tests/data_invariant_instrumentation/borrow.move:17:9+16 # VC: data invariant does not hold at tests/data_invariant_instrumentation/borrow.move:17:9+16 19: assert Gt(select Test::S.y(select Test::R.s($t6)), 0) 20: write_back[LocalRoot($t0)@]($t6) 21: trace_local[d]($t0) 22: $t12 := move($t0) 23: label L1 24: return $t12 }