Skip to content

Commit 056bb6a

Browse files
committed
Merge
2 parents f0f8ee9 + c64be11 commit 056bb6a

3 files changed

Lines changed: 36 additions & 16 deletions

File tree

src/main/scala/rules/Evaluator.scala

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,17 @@ object evaluator extends EvaluationRules {
294294
val t = v1.decider.appliedFresh("letvar", v1.symbolConverter.toSort(x.typ), s1.relevantQuantifiedVariables)
295295
v1.decider.assumeDefinition(t === t0)
296296
val newFuncRec = s1.functionRecorder.recordFreshSnapshot(t.applicable.asInstanceOf[Function])
297-
eval(s1.copy(g = s1.g + (x.localVar, t0), functionRecorder = newFuncRec), e1, pve, v1)(Q)
297+
val possibleTriggersBefore = if (s1.recordPossibleTriggers) s1.possibleTriggers else Map.empty
298+
eval(s1.copy(g = s1.g + (x.localVar, t0), functionRecorder = newFuncRec), e1, pve, v1)((s2, t2, v2) => {
299+
val newPossibleTriggers = if (s2.recordPossibleTriggers) {
300+
val addedTriggers = s2.possibleTriggers -- possibleTriggersBefore.keys
301+
val addedTriggersReplaced = addedTriggers.map(at => at._1.replace(x.localVar, e0) -> at._2)
302+
s2.possibleTriggers ++ addedTriggersReplaced
303+
} else {
304+
s2.possibleTriggers
305+
}
306+
Q(s2.copy(possibleTriggers = newPossibleTriggers), t2, v2)
307+
})
298308
})
299309

300310
/* Strict evaluation of AND */
@@ -878,7 +888,7 @@ object evaluator extends EvaluationRules {
878888
} else failure}
879889
case false =>
880890
val failure1 = createFailure(pve dueTo SeqIndexNegative(e0, e1), v1, s1)
881-
if (s1.retryLevel == 0) {
891+
if (s1.retryLevel == 0 && v1.reportFurtherErrors()) {
882892
v1.decider.assume(AtLeast(t1, IntLiteral(0)))
883893
v1.decider.assert(Less(t1, SeqLength(t0))) {
884894
case true =>
@@ -916,7 +926,7 @@ object evaluator extends EvaluationRules {
916926
else failure}
917927
case false =>
918928
val failure1 = createFailure(pve dueTo SeqIndexNegative(e0, e1), v1, s1)
919-
if (s1.retryLevel == 0) {
929+
if (s1.retryLevel == 0 && v1.reportFurtherErrors()) {
920930
v1.decider.assume(AtLeast(t1, IntLiteral(0)))
921931
v1.decider.assert(Less(t1, SeqLength(t0))) {
922932
case true =>
@@ -1017,9 +1027,13 @@ object evaluator extends EvaluationRules {
10171027
case (s1, Seq(baseT, keyT), v1) => v1.decider.assert(SetIn(keyT, MapDomain(baseT))) {
10181028
case true => Q(s1, MapLookup(baseT, keyT), v1)
10191029
case false =>
1020-
v1.decider.assume(SetIn(keyT, MapDomain(baseT)))
1021-
createFailure(pve dueTo MapKeyNotContained(base, key), v1, s1) combine
1022-
Q(s1, MapLookup(baseT, keyT), v1) //TODO:J write tests for this case!
1030+
val failure1 = createFailure(pve dueTo MapKeyNotContained(base, key), v1, s1)
1031+
if (s1.retryLevel == 0 && v1.reportFurtherErrors()) {
1032+
v1.decider.assume(SetIn(keyT, MapDomain(baseT)))
1033+
failure1 combine Q(s1, MapLookup(baseT, keyT), v1)
1034+
} else {
1035+
failure1
1036+
}
10231037
}
10241038
})
10251039

@@ -1135,7 +1149,7 @@ object evaluator extends EvaluationRules {
11351149
!possibleTriggersBefore.contains(t._1) || possibleTriggersBefore(t._1) != t._2)
11361150

11371151
def wrapInOld(e: ast.Exp) = {
1138-
if (label == "old") {
1152+
if (label == Verifier.PRE_STATE_LABEL) {
11391153
ast.Old(e)(e.pos, e.info, e.errT)
11401154
} else {
11411155
ast.LabelledOld(e, label)(e.pos, e.info, e.errT)

src/main/scala/rules/Executor.scala

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,13 +253,8 @@ object executor extends ExecutionRules {
253253
phase1data = phase1data :+ (s1,
254254
v1.decider.pcs.after(mark),
255255
v1.decider.freshFunctions /* [BRANCH-PARALLELISATION] */)
256-
v1.decider.prover.comment("Loop head block: Check well-definedness of edge conditions")
257-
edgeConditions.foldLeft(Success(): VerificationResult) {
258-
case (result, _) if !result.continueVerification => result
259-
case (intermediateResult, eCond) =>
260-
intermediateResult combine executionFlowController.locally(s1, v1)((s2, v2) => {
261-
eval(s2, eCond, WhileFailed(eCond), v2)((_, _, _) =>
262-
Success())})}})})
256+
Success()
257+
})})
263258
combine executionFlowController.locally(s, v)((s0, v0) => {
264259
v0.decider.prover.comment("Loop head block: Establish invariant")
265260
consumes(s0, invs, LoopInvariantNotEstablished, v0)((sLeftover, _, v1) => {
@@ -276,8 +271,19 @@ object executor extends ExecutionRules {
276271
Success()
277272
else {
278273
execs(s3, stmts, v2)((s4, v3) => {
274+
val edgeCondWelldefinedness = {
275+
v1.decider.prover.comment("Loop head block: Check well-definedness of edge conditions")
276+
edgeConditions.foldLeft(Success(): VerificationResult) {
277+
case (result, _) if !result.continueVerification => result
278+
case (intermediateResult, eCond) =>
279+
intermediateResult combine executionFlowController.locally(s4, v3)((s5, v4) => {
280+
eval(s5, eCond, WhileFailed(eCond), v4)((_, _, _) =>
281+
Success())
282+
})
283+
}
284+
}
279285
v3.decider.prover.comment("Loop head block: Follow loop-internal edges")
280-
follows(s4, sortedEdges, WhileFailed, v3, joinPoint)(Q)})}})}})}))
286+
edgeCondWelldefinedness combine follows(s4, sortedEdges, WhileFailed, v3, joinPoint)(Q)})}})}})}))
281287

282288
case _ =>
283289
/* We've reached a loop head block via an edge other than an in-edge: a normal edge or

0 commit comments

Comments
 (0)