diff --git a/src/main/scala/leon/Evaluator.scala b/src/main/scala/leon/Evaluator.scala index 0f3204e7027257d6dbcaf5c16234accd918347ca..6bb9ef1b3f4bc7fcfbcb9e719c36325a7759bd85 100644 --- a/src/main/scala/leon/Evaluator.scala +++ b/src/main/scala/leon/Evaluator.scala @@ -24,11 +24,16 @@ object Evaluator { case class InfiniteComputation() extends EvaluationResult { val finalResult = None } + case class PostconditionViolationFunctionFromModel() extends EvaluationResult { + val finalResult = None + } + def eval(context: EvaluationContext, expression: Expr, evaluator: Option[(EvaluationContext)=>Boolean], maxSteps: Int=500000) : EvaluationResult = { case class RuntimeErrorEx(msg: String) extends Exception case class InfiniteComputationEx() extends Exception case class TypeErrorEx(typeError: TypeError) extends Exception + case class PostconditionViolationFunctionFromModelEx() extends Exception var left: Int = maxSteps @@ -96,6 +101,7 @@ object Evaluator { val postBody = replace(Map(ResultVariable() -> Variable(freshResID)), matchToIfThenElse(fd.postcondition.get)) rec(frame + ((freshResID -> callResult)), postBody) match { case BooleanLiteral(true) => ; + case BooleanLiteral(false) if !fd.hasImplementation => throw PostconditionViolationFunctionFromModelEx() case BooleanLiteral(false) => throw RuntimeErrorEx("Postcondition violation for " + fd.id.name + " reached in evaluation.") case other => throw TypeErrorEx(TypeError(other, BooleanType)) } @@ -307,6 +313,7 @@ object Evaluator { case RuntimeErrorEx(msg) => RuntimeError(msg) case InfiniteComputationEx() => InfiniteComputation() case TypeErrorEx(te) => te + case PostconditionViolationFunctionFromModelEx() => PostconditionViolationFunctionFromModel() } } } diff --git a/src/main/scala/leon/FairZ3Solver.scala b/src/main/scala/leon/FairZ3Solver.scala index c29e06bac2a14d19695db2cd8507a120aa3f4224..ebca10ab29caa0c40c4742dc0a37c3c1bcc655d3 100644 --- a/src/main/scala/leon/FairZ3Solver.scala +++ b/src/main/scala/leon/FairZ3Solver.scala @@ -827,6 +827,10 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S reporter.info("- Invalid model.") (false, asMap) } + case PostconditionViolationFunctionFromModel() => { + reporter.info("- Invalid Model: postcondition violation of a function that whose implementation was specified by the model") + (false, asMap) + } case other => { reporter.error("Something went wrong. While evaluating the model, we got this: " + other) (false, asMap)