The following program verifies in Carbon but not in Silicon (with or without MCE):
field f: Int
function flag(): Bool
function assuming(b: Bool, r: Ref): Ref
ensures b
ensures result == r
method m(r: Ref)
{
inhale flag() ==> acc(r.f)
var tmp : Int
tmp := assuming(flag(), r).f
}
The issue seems to be that the knowledge that flag() is true, which follows from the field access receiver expression, is apparently not known when checking for the field permission.
If the expression is moved to a separate statement, the program verifies:
method m2(r: Ref)
{
inhale flag() ==> acc(r.f)
var tmp : Int
var r2: Ref
r2 := assuming(flag(), r)
tmp := r2.f
}