Skip to content

Commit 8fa723a

Browse files
authored
Merge pull request #767 from viperproject/meilers_opaque_function_experiment
Opaque function annotation
2 parents c64be11 + 056bb6a commit 8fa723a

4 files changed

Lines changed: 28 additions & 5 deletions

File tree

src/main/scala/rules/Evaluator.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,16 @@ object evaluator extends EvaluationRules {
778778
val snap1 = snap.convert(sorts.Snap)
779779
val preFApp = App(functionSupporter.preconditionVersion(v3.symbolConverter.toFunction(func)), snap1 :: tArgs)
780780
v3.decider.assume(preFApp)
781-
val tFApp = App(v3.symbolConverter.toFunction(func), snap1 :: tArgs)
781+
val funcAnn = func.info.getUniqueInfo[AnnotationInfo]
782+
val tFApp = funcAnn match {
783+
case Some(a) if a.values.contains("opaque") =>
784+
val funcAppAnn = fapp.info.getUniqueInfo[AnnotationInfo]
785+
funcAppAnn match {
786+
case Some(a) if a.values.contains("reveal") => App(v3.symbolConverter.toFunction(func), snap1 :: tArgs)
787+
case _ => App(functionSupporter.limitedVersion(v3.symbolConverter.toFunction(func)), snap1 :: tArgs)
788+
}
789+
case _ => App(v3.symbolConverter.toFunction(func), snap1 :: tArgs)
790+
}
782791
val fr5 =
783792
s4.functionRecorder.changeDepthBy(-1)
784793
.recordSnapshot(fapp, v3.decider.pcs.branchConditions, snap1)

src/main/scala/supporters/functions/FunctionData.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,13 @@ class FunctionData(val programFunction: ast.Function,
259259
val pre = preconditionFunctionApplication
260260
val nestedDefinitionalAxioms = generateNestedDefinitionalAxioms
261261
val body = And(nestedDefinitionalAxioms ++ List(Implies(pre, And(functionApplication === translatedBody))))
262+
val funcAnn = programFunction.info.getUniqueInfo[ast.AnnotationInfo]
263+
val actualPredicateTriggers = funcAnn match {
264+
case Some(a) if a.values.contains("opaque") => Seq()
265+
case _ => predicateTriggers.values.map(pt => Trigger(Seq(triggerFunctionApplication, pt)))
266+
}
262267
val allTriggers = (
263-
Seq(Trigger(functionApplication))
264-
++ predicateTriggers.values.map(pt => Trigger(Seq(triggerFunctionApplication, pt))))
268+
Seq(Trigger(functionApplication)) ++ actualPredicateTriggers)
265269

266270
Forall(arguments, body, allTriggers)})
267271
}

src/main/scala/supporters/functions/HeapAccessReplacingExpressionTranslator.scala

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import viper.silicon.rules.functionSupporter
1515
import viper.silicon.state.{Identifier, SimpleIdentifier, SuffixedIdentifier, SymbolConverter}
1616
import viper.silicon.state.terms._
1717
import viper.silicon.supporters.ExpressionTranslator
18+
import viper.silver.ast.AnnotationInfo
1819
import viper.silver.reporter.{InternalWarningMessage, Reporter}
1920

2021
class HeapAccessReplacingExpressionTranslator(symbolConverter: SymbolConverter,
@@ -127,7 +128,16 @@ class HeapAccessReplacingExpressionTranslator(symbolConverter: SymbolConverter,
127128

128129
case eFApp: ast.FuncApp =>
129130
val silverFunc = program.findFunction(eFApp.funcname)
130-
val fun = symbolConverter.toFunction(silverFunc)
131+
val funcAnn = silverFunc.info.getUniqueInfo[AnnotationInfo]
132+
val fun = funcAnn match {
133+
case Some(a) if a.values.contains("opaque") =>
134+
val funcAppAnn = eFApp.info.getUniqueInfo[AnnotationInfo]
135+
funcAppAnn match {
136+
case Some(a) if a.values.contains("reveal") => symbolConverter.toFunction(silverFunc)
137+
case _ => functionSupporter.limitedVersion(symbolConverter.toFunction(silverFunc))
138+
}
139+
case _ => symbolConverter.toFunction(silverFunc)
140+
}
131141
val args = eFApp.args map (arg => translate(arg))
132142
val snap = getOrFail(data.fappToSnap, eFApp, sorts.Snap)
133143
val fapp = App(fun, snap +: args)

0 commit comments

Comments
 (0)