Skip to content

Commit 19b013b

Browse files
authored
Merge pull request #724 from viperproject/meilers_mce_annotation
MCE annotation
2 parents 7a4c3e4 + 1856253 commit 19b013b

4 files changed

Lines changed: 39 additions & 11 deletions

File tree

src/main/scala/rules/Evaluator.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
package viper.silicon.rules
88

99
import viper.silver.ast
10-
import viper.silver.verifier.{CounterexampleTransformer, PartialVerificationError, TypecheckerWarning}
10+
import viper.silver.verifier.{CounterexampleTransformer, PartialVerificationError, VerifierWarning}
1111
import viper.silver.verifier.errors.{ErrorWrapperWithExampleTransformer, PreconditionInAppFalse}
1212
import viper.silver.verifier.reasons._
1313
import viper.silicon.common.collections.immutable.InsertionOrderedSet
@@ -23,7 +23,7 @@ import viper.silicon.verifier.Verifier
2323
import viper.silicon.{Map, TriggerSets}
2424
import viper.silicon.interfaces.state.{ChunkIdentifer, NonQuantifiedChunk}
2525
import viper.silicon.logger.records.data.{CondExpRecord, EvaluateRecord, ImpliesRecord}
26-
import viper.silver.reporter.WarningsDuringTypechecking
26+
import viper.silver.reporter.WarningsDuringVerification
2727
import viper.silver.ast.WeightedQuantifier
2828

2929
/* TODO: With the current design w.r.t. parallelism, eval should never "move" an execution
@@ -1349,8 +1349,8 @@ object evaluator extends EvaluationRules {
13491349
Q(s, cachedTriggerTerms ++ remainingTriggerTerms, v)
13501350
case _ =>
13511351
for (e <- remainingTriggerExpressions)
1352-
v.reporter.report(WarningsDuringTypechecking(Seq(
1353-
TypecheckerWarning(s"Might not be able to use trigger $e, since it is not evaluated while evaluating the body of the quantifier", e.pos))))
1352+
v.reporter.report(WarningsDuringVerification(Seq(
1353+
VerifierWarning(s"Might not be able to use trigger $e, since it is not evaluated while evaluating the body of the quantifier", e.pos))))
13541354
Q(s, cachedTriggerTerms, v)
13551355
}
13561356
}

src/main/scala/rules/ExecutionFlowController.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package viper.silicon.rules
88

9+
import viper.silver.ast
910
import viper.silicon.Config.ExhaleMode
1011
import viper.silicon.interfaces._
1112
import viper.silicon.logger.records.data.CommentRecord
@@ -129,7 +130,19 @@ object executionFlowController extends ExecutionFlowRules {
129130

130131
val comLog = new CommentRecord("Retry", s0, v.decider.pcs)
131132
val sepIdentifier = v.symbExLog.openScope(comLog)
132-
val temporaryMCE = Verifier.config.exhaleMode != ExhaleMode.Greedy
133+
val temporaryMCE = s0.currentMember.map(_.info.getUniqueInfo[ast.AnnotationInfo]) match {
134+
case Some(Some(ai)) if ai.values.contains("exhaleMode") =>
135+
ai.values("exhaleMode") match {
136+
case Seq("0") | Seq("greedy") =>
137+
false
138+
case Seq("1") | Seq("mce") | Seq("moreCompleteExhale") | Seq("2") | Seq("mceOnDemand") => true
139+
case _ =>
140+
// Invalid annotation was already reported when creating the initial state.
141+
Verifier.config.exhaleMode != ExhaleMode.Greedy
142+
}
143+
case _ => Verifier.config.exhaleMode != ExhaleMode.Greedy
144+
}
145+
133146
action(s0.copy(retrying = true, retryLevel = s.retryLevel, moreCompleteExhale = temporaryMCE), v, (s1, r, v1) => {
134147
v1.symbExLog.closeScope(sepIdentifier)
135148
Q(s1.copy(retrying = false, moreCompleteExhale = s0.moreCompleteExhale), r, v1)

src/main/scala/verifier/DefaultMainVerifier.scala

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ import viper.silicon.utils.Counter
3232
import viper.silver.ast.{BackendType, Member}
3333
import viper.silver.ast.utility.rewriter.Traverse
3434
import viper.silver.cfg.silver.SilverCfg
35-
import viper.silver.reporter.{ConfigurationConfirmation, ExecutionTraceReport, Reporter, VerificationResultMessage, VerificationTerminationMessage, QuantifierChosenTriggersMessage, WarningsDuringTypechecking}
36-
import viper.silver.verifier.TypecheckerWarning
35+
import viper.silver.reporter.{AnnotationWarning, ConfigurationConfirmation, ExecutionTraceReport, QuantifierChosenTriggersMessage, Reporter, VerificationResultMessage, VerificationTerminationMessage, WarningsDuringVerification}
36+
import viper.silver.verifier.VerifierWarning
3737

3838
/* TODO: Extract a suitable MainVerifier interface, probably including
3939
* - def verificationPoolManager: VerificationPoolManager)
@@ -166,13 +166,13 @@ class DefaultMainVerifier(config: Config,
166166
case forall: ast.Forall if forall.isPure =>
167167
val res = viper.silicon.utils.ast.autoTrigger(forall, forall.autoTrigger)
168168
if (res.triggers.isEmpty)
169-
reporter.report(WarningsDuringTypechecking(Seq(TypecheckerWarning("No triggers provided or inferred for quantifier.", res.pos))))
169+
reporter.report(WarningsDuringVerification(Seq(VerifierWarning("No triggers provided or inferred for quantifier.", res.pos))))
170170
reporter report QuantifierChosenTriggersMessage(res, res.triggers)
171171
res
172172
case exists: ast.Exists =>
173173
val res = viper.silicon.utils.ast.autoTrigger(exists, exists.autoTrigger)
174174
if (res.triggers.isEmpty)
175-
reporter.report(WarningsDuringTypechecking(Seq(TypecheckerWarning("No triggers provided or inferred for quantifier.", res.pos))))
175+
reporter.report(WarningsDuringVerification(Seq(VerifierWarning("No triggers provided or inferred for quantifier.", res.pos))))
176176
reporter report QuantifierChosenTriggersMessage(res, res.triggers)
177177
res
178178
}, Traverse.BottomUp)
@@ -303,6 +303,21 @@ class DefaultMainVerifier(config: Config,
303303
case r => r
304304
}
305305

306+
val mce = member.info.getUniqueInfo[ast.AnnotationInfo] match {
307+
case Some(ai) if ai.values.contains("exhaleMode") =>
308+
ai.values("exhaleMode") match {
309+
case Seq("0") | Seq("greedy") | Seq("2") | Seq("mceOnDemand") =>
310+
if (Verifier.config.counterexample.isSupplied)
311+
reporter report AnnotationWarning(s"Member ${member.name} has exhaleMode annotation that may interfere with counterexample generation.")
312+
false
313+
case Seq("1") | Seq("mce") | Seq("moreCompleteExhale") => true
314+
case v =>
315+
reporter report AnnotationWarning(s"Member ${member.name} has invalid exhaleMode annotation value $v. Annotation will be ignored.")
316+
Verifier.config.exhaleMode == ExhaleMode.MoreComplete
317+
}
318+
case _ => Verifier.config.exhaleMode == ExhaleMode.MoreComplete
319+
}
320+
306321
State(program = program,
307322
functionData = functionData,
308323
predicateData = predicateData,
@@ -313,7 +328,7 @@ class DefaultMainVerifier(config: Config,
313328
predicateFormalVarMap = predSnapGenerator.formalVarMap,
314329
currentMember = Some(member),
315330
heapDependentTriggers = resourceTriggers,
316-
moreCompleteExhale = Verifier.config.exhaleMode == ExhaleMode.MoreComplete)
331+
moreCompleteExhale = mce)
317332
}
318333

319334
private def createInitialState(@unused cfg: SilverCfg,

0 commit comments

Comments
 (0)