@@ -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)
0 commit comments