@@ -321,7 +321,8 @@ object producer extends ProductionRules {
321321 val perm = accPred.perm
322322 eval(s, eRcvr, pve, v)((s1, tRcvr, eRcvrNew, v1) =>
323323 eval(s1, perm, pve, v1)((s2, tPerm, ePermNew, v2) =>
324- permissionSupporter.assertNotNegative(s2, tPerm, perm, ePermNew, pve, v2)((s3, v3) => {
324+ permissionSupporter.assertNotNegative(s2, tPerm, perm, ePermNew, pve, v2)((s2a, v3) => {
325+ val s3 = s2a.copy(constrainableARPs = s.constrainableARPs)
325326 val snap = sf(v3.symbolConverter.toSort(field.typ), v3)
326327 val gain = if (! Verifier .config.unsafeWildcardOptimization() || s2.permLocations.contains(field))
327328 PermTimes (tPerm, s3.permissionScalingFactor)
@@ -347,7 +348,8 @@ object producer extends ProductionRules {
347348 val perm = accPred.perm
348349 evals(s, eArgs, _ => pve, v)((s1, tArgs, eArgsNew, v1) =>
349350 eval(s1, perm, pve, v1)((s1a, tPerm, ePermNew, v1a) =>
350- permissionSupporter.assertNotNegative(s1a, tPerm, perm, ePermNew, pve, v1a)((s2, v2) => {
351+ permissionSupporter.assertNotNegative(s1a, tPerm, perm, ePermNew, pve, v1a)((s1b, v2) => {
352+ val s2 = s1b.copy(constrainableARPs = s.constrainableARPs)
351353 val snap = sf(
352354 predicate.body.map(v2.snapshotSupporter.optimalSnapshotSort(_, s.program)._1)
353355 .getOrElse(sorts.Snap ), v2)
@@ -430,8 +432,9 @@ object producer extends ProductionRules {
430432 evalQuantified(s, Forall , forall.variables, Seq (cond), Seq (acc.loc.rcv, acc.perm), optTrigger, qid, pve, v) {
431433 case (s1, qvars, qvarExps, Seq (tCond), eCondNew, Some ((Seq (tRcvr, tPerm), rcvrPerm, tTriggers, (auxGlobals, auxNonGlobals), auxExps)), v1) =>
432434 val tSnap = sf(sorts.FieldValueFunction (v1.symbolConverter.toSort(acc.loc.field.typ), acc.loc.field.name), v1)
435+ val s1a = s1.copy(constrainableARPs = s.constrainableARPs)
433436 quantifiedChunkSupporter.produce(
434- s1 ,
437+ s1a ,
435438 forall,
436439 acc.loc.field,
437440 qvars, qvarExps, Seq (`?r`),
@@ -454,7 +457,7 @@ object producer extends ProductionRules {
454457 QPAssertionNotInjective (acc.loc),
455458 v1
456459 )(Q )
457- case (s1, _, _, _, _, None , v1) => Q (s1, v1)
460+ case (s1, _, _, _, _, None , v1) => Q (s1.copy(constrainableARPs = s.constrainableARPs) , v1)
458461 }
459462
460463 case QuantifiedPermissionAssertion (forall, cond, acc : ast.PredicateAccessPredicate ) =>
@@ -468,8 +471,9 @@ object producer extends ProductionRules {
468471 evalQuantified(s, Forall , forall.variables, Seq (cond), acc.perm +: acc.loc.args, optTrigger, qid, pve, v) {
469472 case (s1, qvars, qvarExps, Seq (tCond), eCondNew, Some ((Seq (tPerm, tArgs @ _* ), permArgs, tTriggers, (auxGlobals, auxNonGlobals), auxExps)), v1) =>
470473 val tSnap = sf(sorts.PredicateSnapFunction (s1.predicateSnapMap(predicate), predicate.name), v1)
474+ val s1a = s1.copy(constrainableARPs = s.constrainableARPs)
471475 quantifiedChunkSupporter.produce(
472- s1 ,
476+ s1a ,
473477 forall,
474478 predicate,
475479 qvars,
@@ -495,7 +499,7 @@ object producer extends ProductionRules {
495499 QPAssertionNotInjective (acc.loc),
496500 v1
497501 )(Q )
498- case (s1, _, _, _, _, None , v1) => Q (s1, v1)
502+ case (s1, _, _, _, _, None , v1) => Q (s1.copy(constrainableARPs = s.constrainableARPs) , v1)
499503 }
500504
501505 case QuantifiedPermissionAssertion (forall, cond, wand : ast.MagicWand ) =>
0 commit comments