============ initial translation from Move ================ [variant baseline] fun Generics::remove<#0>($t0|a: address): Generics::R<#0> { var $t1: address var $t2: Generics::R<#0> 0: $t1 := move($t0) 1: $t2 := move_from>($t1) 2: return $t2 } [variant baseline] fun Generics::remove_u64($t0|a: address): Generics::R { var $t1: address var $t2: Generics::R 0: $t1 := move($t0) 1: $t2 := Generics::remove($t1) 2: return $t2 } ============ after pipeline `spec_instrumentation` ================ [variant verification] fun Generics::remove<#0>($t0|a: address): Generics::R<#0> { var $t1: Generics::R<#0> var $t2: num 0: assume CanModify>($t0) # VC: caller does not have permission to modify `Generics::R<#0>` at given address at tests/spec_instrumentation/generics.move:11:9+9 1: assert CanModify>($t0) 2: $t1 := move_from>($t0) on_abort goto 6 with $t2 3: label L1 # VC: post-condition does not hold at tests/spec_instrumentation/generics.move:20:9+25 4: assert Not(exists>($t0)) 5: return $t1 6: label L2 7: abort($t2) } [variant verification] fun Generics::remove_u64($t0|a: address): Generics::R { var $t1: Generics::R var $t2: bool var $t3: num 0: assume CanModify>($t0) # VC: caller does not have permission to modify `Generics::R` at given address at tests/spec_instrumentation/generics.move:24:9+14 1: assert CanModify>($t0) 2: $t1 := opaque begin: Generics::remove($t0) 3: havoc[val]($t2) 4: if ($t2) goto 5 else goto 8 5: label L4 6: trace_abort($t3) 7: goto 16 8: label L3 9: modifies global>($t0) 10: assume WellFormed($t1) 11: assume Not(exists>($t0)) 12: $t1 := opaque end: Generics::remove($t0) 13: label L1 # VC: post-condition does not hold at tests/spec_instrumentation/generics.move:20:9+25 14: assert Not(exists>($t0)) 15: return $t1 16: label L2 17: abort($t3) } ==== spec-instrumenter input specs ==== fun Generics::remove[baseline] spec { modifies global>($t0); ensures Not(exists>($t0)); } fun Generics::remove[verification] spec { modifies global>($t0); ensures Not(exists>($t0)); } fun Generics::remove_u64[baseline] spec { modifies global>($t0); ensures Not(exists>($t0)); } fun Generics::remove_u64[verification] spec { modifies global>($t0); ensures Not(exists>($t0)); }