Skip to content

Commit 39deb12

Browse files
authored
Fixing issue #950 (#952)
* Updating FunctionRecorder quantifier context also in Producer and Consumer
1 parent 3e1d616 commit 39deb12

3 files changed

Lines changed: 14 additions & 7 deletions

File tree

silver

src/main/scala/rules/Consumer.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ object consumer extends ConsumptionRules {
259259
})
260260
})))
261261

262-
case QuantifiedPermissionAssertion(forall, cond, accPred) =>
262+
case qpa@QuantifiedPermissionAssertion(forall, cond, accPred) =>
263263
val resAcc = accPred.loc
264264
val eArgs = resAcc.args(s.program)
265265
val ePerm = accPred.perm
@@ -281,7 +281,8 @@ object consumer extends ConsumptionRules {
281281
val optTrigger =
282282
if (forall.triggers.isEmpty) None
283283
else Some(forall.triggers)
284-
evalQuantified(s, Forall, forall.variables, Seq(cond), ePerm +: eArgs, optTrigger, qid, pve, v) {
284+
val s0 = s.copy(functionRecorder = s.functionRecorder.enterQuantifiedExp(qpa))
285+
evalQuantified(s0, Forall, forall.variables, Seq(cond), ePerm +: eArgs, optTrigger, qid, pve, v) {
285286
case (s1, qvars, qvarExps, Seq(tCond), condNew, Some((Seq(tPerm, tArgs@_*), permArgsNew, tTriggers, (auxGlobals, auxNonGlobals), auxExps)), v1) =>
286287
v1.heapSupporter.consumeQuantified(
287288
s = s1,
@@ -309,7 +310,10 @@ object consumer extends ConsumptionRules {
309310
negativePermissionReason = NegativePermission(ePerm),
310311
notInjectiveReason = QPAssertionNotInjective(resAcc),
311312
insufficientPermissionReason = insuffReason,
312-
v1)((s2, h2, snap, v2) => Q(s2.copy(constrainableARPs = s.constrainableARPs), h2, snap, v2))
313+
v1)((s2, h2, snap, v2) => {
314+
val s3 = s2.copy(constrainableARPs = s.constrainableARPs, functionRecorder = s2.functionRecorder.leaveQuantifiedExp(qpa))
315+
Q(s3, h2, snap, v2)
316+
})
313317
case (s1, _, _, _, _, None, v1) => Q(s1, h, if (returnSnap) Some(Unit) else None, v1)
314318
}
315319

src/main/scala/rules/Producer.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ object producer extends ProductionRules {
334334
})))
335335

336336

337-
case QuantifiedPermissionAssertion(forall, cond, accPred) =>
337+
case qpa@QuantifiedPermissionAssertion(forall, cond, accPred) =>
338338
val resource = accPred.res(s.program)
339339
val resAcc = accPred.loc
340340
val eArgs = resAcc.args(s.program)
@@ -353,12 +353,15 @@ object producer extends ProductionRules {
353353
val optTrigger =
354354
if (forall.triggers.isEmpty) None
355355
else Some(forall.triggers)
356-
evalQuantified(s, Forall, forall.variables, Seq(cond), ePerm +: eArgs, optTrigger, qid, pve, v) {
356+
val s0 = s.copy(functionRecorder = s.functionRecorder.enterQuantifiedExp(qpa))
357+
evalQuantified(s0, Forall, forall.variables, Seq(cond), ePerm +: eArgs, optTrigger, qid, pve, v) {
357358
case (s1, qvars, qvarExps, Seq(tCond), eCondNew, Some((Seq(tPerm, tArgs@_*), permArgs, tTriggers, (auxGlobals, auxNonGlobals), auxExps)), v1) =>
358359
val s1a = s1.copy(constrainableARPs = s.constrainableARPs)
359360
v1.heapSupporter.produceQuantified(s1a, sf, forall, resource, qvars, qvarExps, tFormalArgs, eFormalArgs, qid, optTrigger, tTriggers, auxGlobals, auxNonGlobals,
360361
auxExps.map(_._1), auxExps.map(_._2), tCond, eCondNew.map(_.head), tArgs, permArgs.map(_.tail), tPerm, permArgs.map(_.head), pve, NegativePermission(ePerm),
361-
QPAssertionNotInjective(resAcc), v1)(Q)
362+
QPAssertionNotInjective(resAcc), v1)((s2, v2) => {
363+
Q(s2.copy(functionRecorder = s2.functionRecorder.leaveQuantifiedExp(qpa)), v2)
364+
})
362365
case (s1, _, _, _, _, None, v1) => Q(s1.copy(constrainableARPs = s.constrainableARPs), v1)
363366
}
364367

0 commit comments

Comments
 (0)