@@ -21,6 +21,7 @@ import viper.silicon.state.terms._
21
21
import viper .silicon .state .terms .implicits ._
22
22
import viper .silicon .state .terms .perms .IsPositive
23
23
import viper .silicon .state .terms .predef .`?r`
24
+ import viper .silicon .state .terms .utils .makeAllLimited
24
25
import viper .silicon .utils .ast ._
25
26
import viper .silicon .utils .toSf
26
27
import viper .silicon .verifier .Verifier
@@ -1348,12 +1349,33 @@ object evaluator extends EvaluationRules {
1348
1349
case (s2, ts1, es1New1, Some ((ts2, es2New1, tTriggers, (tAuxGlobal, tAux), eAuxExps, additionalPossibleTriggers))) =>
1349
1350
val s3 = s.copy(possibleTriggers = s.possibleTriggers ++ additionalPossibleTriggers)
1350
1351
.preserveAfterLocalEvaluation(s2)
1351
- Q (s3, tVars, Option .when(withExp)(varPairs map (e => ast.LocalVarDecl (e._2.get.name, e._2.get.typ)(e._2.get.pos, e._2.get.info, e._2.get.errT))), ts1, es1New1, Some ((ts2, es2New1, tTriggers, (tAuxGlobal, tAux), Option .when(withExp)((eAuxExps.get._1, eAuxExps.get._2)))), v)
1352
+ val triggerTerms = tTriggers.flatMap(_.p)
1353
+ val triggerTermFuncs = triggerTerms.flatMap{
1354
+ case App (f : HeapDepFun , _) => Some (f)
1355
+ case _ => None
1356
+ }.toSet
1357
+ val ts2TriggersReplaced = replaceTriggersIn(triggerTerms, ts2)
1358
+ val tAuxTriggersReplaced = replaceTriggersIn(triggerTerms, tAux)
1359
+ val tAuxGlobalTriggersReplaced = replaceTriggersIn(triggerTerms, tAuxGlobal)
1360
+ Q (s3, tVars, Option .when(withExp)(varPairs map (e => ast.LocalVarDecl (e._2.get.name, e._2.get.typ)(e._2.get.pos, e._2.get.info, e._2.get.errT))), ts1, es1New1, Some ((ts2TriggersReplaced, es2New1, tTriggers, (tAuxGlobalTriggersReplaced, tAuxTriggersReplaced), Option .when(withExp)((eAuxExps.get._1, eAuxExps.get._2)))), v)
1352
1361
case (s2, ts1, es1New1, None ) =>
1353
1362
Q (s2, tVars, Option .when(withExp)(varPairs map (e => ast.LocalVarDecl (e._2.get.name, e._2.get.typ)(e._2.get.pos, e._2.get.info, e._2.get.errT))), ts1, es1New1, None , v)
1354
1363
}
1355
1364
}
1356
1365
1366
+ private def replaceTriggersIn [T <: Term ](triggerTerms : Seq [Term ], replaceIn : Seq [T ]) : Seq [T ] = {
1367
+ val triggerTermFuncs = triggerTerms.flatMap {
1368
+ case App (f : HeapDepFun , _) => Some (f)
1369
+ case _ => None
1370
+ }.toSet
1371
+
1372
+ replaceIn.map(t => {
1373
+ t.transform {
1374
+ case app@ App (f : HeapDepFun , _) if triggerTermFuncs.contains(f) && triggerTerms.contains(makeAllLimited(app)) => makeAllLimited(app)
1375
+ }()
1376
+ })
1377
+ }
1378
+
1357
1379
private def evalImplies (s : State ,
1358
1380
tLhs : Term ,
1359
1381
eLhs : (ast.Exp , Option [ast.Exp ]),
@@ -1563,22 +1585,10 @@ object evaluator extends EvaluationRules {
1563
1585
(Q : (State , Seq [Term ], Verifier ) => VerificationResult )
1564
1586
: VerificationResult = {
1565
1587
1566
- def transformPotentialFuncApp (t : Term ) = t match {
1567
- case app@ App (fun : HeapDepFun , _) =>
1568
- /** Heap-dependent functions that are used as tTriggerSets should be used
1569
- * in the limited version, because it allows for more instantiations.
1570
- * Keep this code in sync with [[viper.silicon.supporters.ExpressionTranslator.translate ]]
1571
- *
1572
- */
1573
- app.copy(applicable = functionSupporter.limitedVersion(fun))
1574
- case other =>
1575
- other
1576
- }
1577
-
1578
1588
val (cachedTriggerTerms, remainingTriggerExpressions) =
1579
1589
exps.map {
1580
1590
case pt @ (_ : ast.PossibleTrigger | _ : ast.FieldAccess | _ : ast.LabelledOld | _ : ast.Old ) =>
1581
- val cachedTrigger = s.possibleTriggers.get(pt).map(t => transformPotentialFuncApp (t))
1591
+ val cachedTrigger = s.possibleTriggers.get(pt).map(t => makeAllLimited (t))
1582
1592
(cachedTrigger, if (cachedTrigger.isDefined) None else Some (pt))
1583
1593
case e => (None , Some (e))
1584
1594
}.unzip match {
@@ -1647,7 +1657,7 @@ object evaluator extends EvaluationRules {
1647
1657
(r, optRemainingTriggerTerms) match {
1648
1658
case (Success (), Some (remainingTriggerTerms)) =>
1649
1659
v.decider.assume(pcDelta, Option .when(withExp)(DebugExp .createInstance(" pcDeltaExp" , children = pcDeltaExp)), enforceAssumption = false )
1650
- Q (s, cachedTriggerTerms ++ remainingTriggerTerms, v)
1660
+ Q (s, cachedTriggerTerms ++ remainingTriggerTerms.map(t => makeAllLimited(t)) , v)
1651
1661
case _ =>
1652
1662
for (e <- remainingTriggerExpressions)
1653
1663
v.reporter.report(WarningsDuringVerification (Seq (
0 commit comments