@@ -15,6 +15,7 @@ import viper.silicon.rules.functionSupporter
1515import viper .silicon .state .{Identifier , SimpleIdentifier , SuffixedIdentifier , SymbolConverter }
1616import viper .silicon .state .terms ._
1717import viper .silicon .supporters .ExpressionTranslator
18+ import viper .silver .ast .AnnotationInfo
1819import viper .silver .reporter .{InternalWarningMessage , Reporter }
1920
2021class 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