@@ -32,8 +32,8 @@ import viper.silicon.utils.Counter
3232import viper .silver .ast .{BackendType , Member }
3333import viper .silver .ast .utility .rewriter .Traverse
3434import 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