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