From 15f660106a4b82546714a0f42bd4a4d085baea30 Mon Sep 17 00:00:00 2001 From: Regis Blanc <regwblanc@gmail.com> Date: Tue, 3 Mar 2015 15:21:15 +0100 Subject: [PATCH] no-xlang checking phase --- src/main/scala/leon/Main.scala | 9 +++- .../leon/xlang/NoXlangFeaturesChecking.scala | 51 +++++++++++++++++++ .../purescala/error/Asserts.scala | 16 ++++++ .../PureScalaVerificationRegression.scala | 5 +- 4 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 src/main/scala/leon/xlang/NoXlangFeaturesChecking.scala create mode 100644 src/test/resources/regression/verification/purescala/error/Asserts.scala diff --git a/src/main/scala/leon/Main.scala b/src/main/scala/leon/Main.scala index 49ab85e95..46b37eaf6 100644 --- a/src/main/scala/leon/Main.scala +++ b/src/main/scala/leon/Main.scala @@ -211,9 +211,16 @@ object Main { import verification.AnalysisPhase import repair.RepairPhase + val pipeSanityCheck : Pipeline[Program, Program] = + if(!settings.xlang) + xlang.NoXlangFeaturesChecking + else + NoopPhase() + val pipeBegin : Pipeline[List[String],Program] = ExtractionPhase andThen - PreprocessingPhase + PreprocessingPhase andThen + pipeSanityCheck val pipeProcess: Pipeline[Program, Any] = { if (settings.synthesis) { diff --git a/src/main/scala/leon/xlang/NoXlangFeaturesChecking.scala b/src/main/scala/leon/xlang/NoXlangFeaturesChecking.scala new file mode 100644 index 000000000..2bc7d702e --- /dev/null +++ b/src/main/scala/leon/xlang/NoXlangFeaturesChecking.scala @@ -0,0 +1,51 @@ +/* Copyright 2009-2014 EPFL, Lausanne */ + +package leon +package xlang + +import purescala.Common._ +import purescala.TypeTrees._ +import purescala.Trees._ +import purescala.Definitions._ +import purescala.Constructors._ + +import purescala.TreeOps.exists +import xlang.Trees._ + +object NoXlangFeaturesChecking extends UnitPhase[Program] { + + val name = "no-xlang" + val description = "Ensure and enforce that no xlang features are used" + + private def isXlangExpr(expr: Expr): Boolean = expr match { + + case Block(_, _) => true + + case Assignment(_, _) => true + + case While(_, _) => true + + case Epsilon(_, _) => true + + case EpsilonVariable(_, _) => true + + case LetVar(_, _, _) => true + + case Waypoint(_, _, _) => true + + case ArrayUpdate(_, _, _) => true + + case _ => false + + } + + override def apply(ctx: LeonContext, pgm: Program): Unit = { + pgm.definedFunctions.foreach(fd => { + if(exists(isXlangExpr)(fd.fullBody)) { + ctx.reporter.fatalError(fd.fullBody.getPos, "Expr is using xlang features") + } + }) + } + +} + diff --git a/src/test/resources/regression/verification/purescala/error/Asserts.scala b/src/test/resources/regression/verification/purescala/error/Asserts.scala new file mode 100644 index 000000000..e19e8f282 --- /dev/null +++ b/src/test/resources/regression/verification/purescala/error/Asserts.scala @@ -0,0 +1,16 @@ +import leon.annotation._ +import leon.lang._ +import leon.lang._ + +object Asserts { + + def assert1(i: BigInt): BigInt = { // we might define assert like so + require(i >= 0) + i + } + + def sum(to: BigInt): BigInt = { + assert1(to) + to + } +} diff --git a/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala b/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala index 71148aa5d..b4f119ad8 100644 --- a/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala +++ b/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala @@ -23,8 +23,9 @@ class PureScalaVerificationRegression extends LeonTestSuite { private case class Output(report : VerificationReport, reporter : Reporter) private def mkPipeline : Pipeline[List[String], VerificationReport] = - ExtractionPhase andThen - PreprocessingPhase andThen + ExtractionPhase andThen + PreprocessingPhase andThen + xlang.NoXlangFeaturesChecking andThen AnalysisPhase private def mkTest(file : File, leonOptions : Seq[String], forError: Boolean)(block: Output=>Unit) = { -- GitLab