Skip to content

Commit 7534570

Browse files
authored
Merge pull request #817 from viperproject/meilers_avoid_qp_wildcard_constraint_quantifier
Avoid using a quantifier for wildcard constraints for quantified resources
2 parents 3d619b8 + e87700a commit 7534570

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

src/main/scala/rules/Executor.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ object executor extends ExecutionRules {
387387
relevantChunks,
388388
Seq(`?r`),
389389
`?r` === tRcvr,
390+
Some(Seq(tRcvr)),
390391
field,
391392
FullPerm,
392393
chunkOrderHeuristics,

src/main/scala/rules/QuantifiedChunkSupport.scala

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
11461146
relevantChunks,
11471147
formalQVars,
11481148
And(condOfInvOfLoc, And(imagesOfFormalQVars)),
1149+
None,
11491150
resource,
11501151
rPerm,
11511152
chunkOrderHeuristics,
@@ -1192,6 +1193,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
11921193
relevantChunks,
11931194
formalQVars,
11941195
And(condOfInvOfLoc, And(imagesOfFormalQVars)),
1196+
None,
11951197
resource,
11961198
lossOfInvOfLoc,
11971199
chunkOrderHeuristics,
@@ -1259,6 +1261,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
12591261
relevantChunks,
12601262
codomainQVars,
12611263
And(codomainQVars.zip(arguments).map { case (r, e) => r === e }),
1264+
Some(arguments),
12621265
resource,
12631266
rPerm,
12641267
chunkOrderHeuristics,
@@ -1302,6 +1305,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
13021305
relevantChunks,
13031306
codomainQVars,
13041307
And(codomainQVars.zip(arguments).map { case (r, e) => r === e }),
1308+
Some(arguments),
13051309
resource,
13061310
permissions,
13071311
chunkOrderHeuristics,
@@ -1339,6 +1343,9 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
13391343
relevantChunks: Seq[QuantifiedBasicChunk],
13401344
codomainQVars: Seq[Var], /* rs := r_1, ..., r_m */
13411345
condition: Term, // c(rs)
1346+
optQVarValues: Option[Seq[Term]], /* optionally actual known values vs := v_1, ..., v_m for all codomainQVars
1347+
(if we're consuming a single location), i.e., if condition is
1348+
forall i :: r_i == v_i */
13421349
resource: ast.Resource, // field f: e_1(rs).f; or predicate P: P(es); or magic wand
13431350
perms: Term, // p(rs)
13441351
chunkOrderHeuristic: Seq[QuantifiedBasicChunk] => Seq[QuantifiedBasicChunk],
@@ -1409,7 +1416,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
14091416
else {
14101417
val (permissionConstraint, depletedCheck) =
14111418
createPermissionConstraintAndDepletedCheck(
1412-
codomainQVars, condition, perms,constrainPermissions, ithChunk, ithPTaken, v)
1419+
codomainQVars, condition, optQVarValues, perms, constrainPermissions, ithChunk, ithPTaken, v)
14131420

14141421
if (constrainPermissions) {
14151422
v.decider.prover.comment(s"Constrain original permissions $perms")
@@ -1459,6 +1466,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
14591466

14601467
private def createPermissionConstraintAndDepletedCheck(codomainQVars: Seq[Var], /* rs := r_1, ..., r_m */
14611468
condition: Term, // c(rs)
1469+
optQVarValues: Option[Seq[Term]], /* vs := v_1, ..., v_m if c is r_1 == v_1 && ... */
14621470
perms: Term, // p(rs)
14631471
constrainPermissions: Boolean,
14641472
ithChunk: QuantifiedBasicChunk,
@@ -1499,8 +1507,14 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
14991507
(quantifiedPermissionConstraint.map(_.instantiate(args)),
15001508
quantifiedDepletedCheck.instantiate(args))
15011509
case None =>
1502-
(quantifiedPermissionConstraint,
1503-
quantifiedDepletedCheck)
1510+
optQVarValues match {
1511+
case Some(values) =>
1512+
(quantifiedPermissionConstraint.map(_.instantiate(values)),
1513+
quantifiedDepletedCheck)
1514+
case _ =>
1515+
(quantifiedPermissionConstraint,
1516+
quantifiedDepletedCheck)
1517+
}
15041518
}
15051519

15061520
(permissionConstraint.getOrElse(True), depletedCheck)

0 commit comments

Comments
 (0)