From 67dc991d669980493beb5ad098b6294e0094f96b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com>
Date: Tue, 11 Dec 2012 23:24:41 +0100
Subject: [PATCH] adding new regressions tests

---
 src/main/scala/leon/Settings.scala            |   2 +-
 .../scala/leon/solvers/z3/FairZ3Solver.scala  |   1 +
 .../leon/verification/AnalysisPhase.scala     |   1 +
 .../leon/xlang/ArrayTransformation.scala      |   4 +-
 .../scala/leon/xlang/FunctionClosure.scala    |  10 +-
 .../xlang/ImperativeCodeElimination.scala     |   5 +
 src/main/scala/leon/xlang/Trees.scala         | 108 +++++++++++-------
 .../verification/xlang/invalid/Array1.scala   |   9 ++
 .../verification/xlang/invalid/Array2.scala   |   9 ++
 .../verification/xlang/invalid/Array3.scala   |  16 +++
 .../verification/xlang/invalid/Array4.scala   |   9 ++
 .../verification/xlang/invalid/Array5.scala   |  10 ++
 .../verification/xlang/invalid/Epsilon1.scala |  12 ++
 .../verification/xlang/invalid/Epsilon2.scala |  11 ++
 .../verification/xlang/invalid/Epsilon3.scala |   9 ++
 .../verification/xlang/invalid/Epsilon4.scala |  27 +++++
 .../verification/xlang/invalid/Epsilon5.scala |   9 ++
 .../verification/xlang/invalid/Epsilon6.scala |   9 ++
 .../verification/xlang/invalid/IfExpr2.scala  |  14 +++
 .../verification/xlang/invalid/MyTuple1.scala |  11 ++
 .../verification/xlang/invalid/MyTuple2.scala |  14 +++
 .../verification/xlang/invalid/MyTuple3.scala |   7 ++
 .../verification/xlang/invalid/Unit1.scala    |   7 ++
 .../verification/xlang/valid/Array1.scala     |   9 ++
 .../verification/xlang/valid/Array10.scala    |   9 ++
 .../verification/xlang/valid/Array2.scala     |   9 ++
 .../verification/xlang/valid/Array3.scala     |  16 +++
 .../verification/xlang/valid/Array4.scala     |  15 +++
 .../verification/xlang/valid/Array5.scala     |  20 ++++
 .../verification/xlang/valid/Array6.scala     |  15 +++
 .../verification/xlang/valid/Array7.scala     |  17 +++
 .../verification/xlang/valid/Array8.scala     |   8 ++
 .../verification/xlang/valid/Array9.scala     |  15 +++
 .../verification/xlang/valid/Assign1.scala    |  12 ++
 .../verification/xlang/valid/Epsilon1.scala   |   9 ++
 .../verification/xlang/valid/Epsilon2.scala   |  13 +++
 .../verification/xlang/valid/Epsilon3.scala   |   9 ++
 .../verification/xlang/valid/Epsilon4.scala   |  32 ++++++
 .../verification/xlang/valid/Epsilon5.scala   |   9 ++
 .../verification/xlang/valid/Field1.scala     |  11 ++
 .../verification/xlang/valid/Field2.scala     |  11 ++
 .../verification/xlang/valid/IfExpr1.scala    |  13 +++
 .../verification/xlang/valid/IfExpr2.scala    |  14 +++
 .../verification/xlang/valid/IfExpr3.scala    |  19 +++
 .../verification/xlang/valid/IfExpr4.scala    |  18 +++
 .../xlang/valid/InstanceOf1.scala             |  18 +++
 .../verification/xlang/valid/MyTuple3.scala   |   8 ++
 .../verification/xlang/valid/MyTuple4.scala   |  14 +++
 .../verification/xlang/valid/MyTuple5.scala   |  16 +++
 .../verification/xlang/valid/MyTuple6.scala   |   8 ++
 .../verification/xlang/valid/Nested1.scala    |  15 +++
 .../verification/xlang/valid/Nested10.scala   |  14 +++
 .../verification/xlang/valid/Nested11.scala   |  14 +++
 .../verification/xlang/valid/Nested12.scala   |  17 +++
 .../verification/xlang/valid/Nested13.scala   |  21 ++++
 .../verification/xlang/valid/Nested14.scala   |  11 ++
 .../verification/xlang/valid/Nested2.scala    |  13 +++
 .../verification/xlang/valid/Nested3.scala    |  15 +++
 .../verification/xlang/valid/Nested4.scala    |  19 +++
 .../verification/xlang/valid/Nested5.scala    |  12 ++
 .../verification/xlang/valid/Nested6.scala    |  14 +++
 .../verification/xlang/valid/Nested7.scala    |  19 +++
 .../verification/xlang/valid/Nested8.scala    |  43 +++++++
 .../verification/xlang/valid/Nested9.scala    |  23 ++++
 .../verification/xlang/valid/NestedVar.scala  |  17 +++
 .../verification/xlang/valid/Unit1.scala      |   7 ++
 .../verification/xlang/valid/Unit2.scala      |   7 ++
 .../verification/xlang/valid/While1.scala     |  13 +++
 .../verification/xlang/valid/While2.scala     |  13 +++
 .../verification/xlang/valid/While3.scala     |  13 +++
 70 files changed, 953 insertions(+), 48 deletions(-)
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Array1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Array2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Array3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Array4.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Array5.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Epsilon1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Epsilon2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Epsilon3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Epsilon4.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Epsilon5.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Epsilon6.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/IfExpr2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/MyTuple1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/MyTuple2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/MyTuple3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/invalid/Unit1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array10.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array4.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array5.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array6.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array7.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array8.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Array9.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Assign1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Epsilon1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Epsilon2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Epsilon3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Epsilon4.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Epsilon5.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Field1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Field2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/IfExpr1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/IfExpr2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/IfExpr3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/IfExpr4.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/InstanceOf1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/MyTuple3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/MyTuple4.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/MyTuple5.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/MyTuple6.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested10.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested11.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested12.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested13.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested14.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested3.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested4.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested5.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested6.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested7.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested8.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Nested9.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/NestedVar.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Unit1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/Unit2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/While1.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/While2.scala
 create mode 100644 src/test/resources/regression/verification/xlang/valid/While3.scala

diff --git a/src/main/scala/leon/Settings.scala b/src/main/scala/leon/Settings.scala
index 9aa0c57ac..3aba078e9 100644
--- a/src/main/scala/leon/Settings.scala
+++ b/src/main/scala/leon/Settings.scala
@@ -5,7 +5,7 @@ package leon
 object Settings {
   lazy val reporter: Reporter = new DefaultReporter
 
-  var showIDs: Boolean = false
+  var showIDs: Boolean = true
   var silentlyTolerateNonPureBodies: Boolean = false
 }
 
diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
index c9c69511e..bc246e2e6 100644
--- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala
@@ -291,6 +291,7 @@ class FairZ3Solver(context : LeonContext)
       val newClauses = unrollingBank.scanForNewTemplates(expression)
 
       for (cl <- newClauses) {
+        println("transforming to z3: " + cl)
         solver.assertCnstr(z3.mkImplies(guard, toZ3Formula(cl).get))
       }
     }
diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala
index d4a2b71b7..2785fae3e 100644
--- a/src/main/scala/leon/verification/AnalysisPhase.scala
+++ b/src/main/scala/leon/verification/AnalysisPhase.scala
@@ -21,6 +21,7 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] {
   )
 
   def run(ctx: LeonContext)(program: Program) : VerificationReport = {
+    println(program)
     val functionsToAnalyse : MutableSet[String] = MutableSet.empty
 
     for(opt <- ctx.options) opt match {
diff --git a/src/main/scala/leon/xlang/ArrayTransformation.scala b/src/main/scala/leon/xlang/ArrayTransformation.scala
index 1d7a20dcf..880e870f5 100644
--- a/src/main/scala/leon/xlang/ArrayTransformation.scala
+++ b/src/main/scala/leon/xlang/ArrayTransformation.scala
@@ -14,8 +14,11 @@ object ArrayTransformation extends TransformationPhase {
   val name = "Array Transformation"
   val description = "Add bound checking for array access and remove array update with side effect"
 
+  private var id2FreshId = Map[Identifier, Identifier]()
+
   def apply(ctx: LeonContext, pgm: Program): Program = {
 
+    id2FreshId = Map()
     val allFuns = pgm.definedFunctions
     allFuns.foreach(fd => {
       id2FreshId = Map()
@@ -26,7 +29,6 @@ object ArrayTransformation extends TransformationPhase {
     pgm
   }
 
-  private var id2FreshId = Map[Identifier, Identifier]()
 
   def transform(expr: Expr): Expr = expr match {
     case sel@ArraySelect(a, i) => {
diff --git a/src/main/scala/leon/xlang/FunctionClosure.scala b/src/main/scala/leon/xlang/FunctionClosure.scala
index 6c5000849..47e0cbeed 100644
--- a/src/main/scala/leon/xlang/FunctionClosure.scala
+++ b/src/main/scala/leon/xlang/FunctionClosure.scala
@@ -21,14 +21,20 @@ object FunctionClosure extends TransformationPhase{
   private var topLevelFuns: Set[FunDef] = Set()
 
   def apply(ctx: LeonContext, program: Program): Program = {
-    newFunDefs = Map()
+
+    pathConstraints = Nil
+    enclosingLets  = Nil
+    newFunDefs  = Map()
+    topLevelFuns = Set()
+
     val funDefs = program.definedFunctions
     funDefs.foreach(fd => {
       pathConstraints = fd.precondition.toList
       fd.body = fd.body.map(b => functionClosure(b, fd.args.map(_.id).toSet, Map(), Map()))
     })
     val Program(id, ObjectDef(objId, defs, invariants)) = program
-    Program(id, ObjectDef(objId, defs ++ topLevelFuns, invariants))
+    val res = Program(id, ObjectDef(objId, defs ++ topLevelFuns, invariants))
+    res
   }
 
   private def functionClosure(expr: Expr, bindedVars: Set[Identifier], id2freshId: Map[Identifier, Identifier], fd2FreshFd: Map[FunDef, (FunDef, Seq[Variable])]): Expr = expr match {
diff --git a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
index c66a70949..330e44c13 100644
--- a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
+++ b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
@@ -19,8 +19,12 @@ object ImperativeCodeElimination extends TransformationPhase {
   private var parent: FunDef = null //the enclosing fundef
 
   def apply(ctx: LeonContext, pgm: Program): Program = {
+    varInScope = Set()
+    parent = null
+
     val allFuns = pgm.definedFunctions
     allFuns.foreach(fd => fd.body.map(body => {
+      println("processing fun: " + fd)
       parent = fd
       val (res, scope, _) = toFunction(body)
       fd.body = Some(scope(res))
@@ -35,6 +39,7 @@ object ImperativeCodeElimination extends TransformationPhase {
   private def toFunction(expr: Expr): (Expr, Expr => Expr, Map[Identifier, Identifier]) = {
     val res = expr match {
       case LetVar(id, e, b) => {
+        println("in letvar with id: " + id)
         val newId = FreshIdentifier(id.name).setType(id.getType)
         val (rhsVal, rhsScope, rhsFun) = toFunction(e)
         varInScope += id
diff --git a/src/main/scala/leon/xlang/Trees.scala b/src/main/scala/leon/xlang/Trees.scala
index 8995aba73..31c717784 100644
--- a/src/main/scala/leon/xlang/Trees.scala
+++ b/src/main/scala/leon/xlang/Trees.scala
@@ -260,39 +260,51 @@ object Trees {
           (fd.precondition, fd.postcondition) match {
             case (None, None) =>
                 Some((Seq(b, body), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  nfd.body = Some(as(0))
-                  LetDef(nfd, as(1))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //nfd.body = Some(as(0))
+                  //LetDef(nfd, as(1))
+                  fd.body = Some(as(0))
+                  LetDef(fd, as(1))
                 }))
             case (Some(pre), None) =>
                 Some((Seq(b, body, pre), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  nfd.body = Some(as(0))
-                  nfd.precondition = Some(as(2))
-                  LetDef(nfd, as(1))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //nfd.body = Some(as(0))
+                  //nfd.precondition = Some(as(2))
+                  //LetDef(nfd, as(1))
+                  fd.body = Some(as(0))
+                  fd.precondition = Some(as(2))
+                  LetDef(fd, as(1))
                 }))
             case (None, Some(post)) =>
                 Some((Seq(b, body, post), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  nfd.body = Some(as(0))
-                  nfd.postcondition = Some(as(2))
-                  LetDef(nfd, as(1))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //nfd.body = Some(as(0))
+                  //nfd.postcondition = Some(as(2))
+                  //LetDef(nfd, as(1))
+                  fd.body = Some(as(0))
+                  fd.postcondition = Some(as(2))
+                  LetDef(fd, as(1))
                 }))
             case (Some(pre), Some(post)) =>
                 Some((Seq(b, body, pre, post), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  nfd.body = Some(as(0))
-                  nfd.precondition = Some(as(2))
-                  nfd.postcondition = Some(as(3))
-                  LetDef(nfd, as(1))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //nfd.body = Some(as(0))
+                  //nfd.precondition = Some(as(2))
+                  //nfd.postcondition = Some(as(3))
+                  //LetDef(nfd, as(1))
+                  fd.body = Some(as(0))
+                  fd.precondition = Some(as(2))
+                  fd.postcondition = Some(as(3))
+                  LetDef(fd, as(1))
                 }))
           }
             
@@ -300,35 +312,43 @@ object Trees {
           (fd.precondition, fd.postcondition) match {
             case (None, None) =>
                 Some((Seq(body), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  LetDef(nfd, as(0))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //LetDef(nfd, as(0))
+                  LetDef(fd, as(0))
                 }))
             case (Some(pre), None) =>
                 Some((Seq(body, pre), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  nfd.precondition = Some(as(1))
-                  LetDef(nfd, as(0))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //nfd.precondition = Some(as(1))
+                  //LetDef(nfd, as(0))
+                  fd.precondition = Some(as(1))
+                  LetDef(fd, as(0))
                 }))
             case (None, Some(post)) =>
                 Some((Seq(body, post), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  nfd.postcondition = Some(as(1))
-                  LetDef(nfd, as(0))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //nfd.postcondition = Some(as(1))
+                  //LetDef(nfd, as(0))
+                  fd.postcondition = Some(as(1))
+                  LetDef(fd, as(0))
                 }))
             case (Some(pre), Some(post)) =>
                 Some((Seq(body, pre, post), (as: Seq[Expr]) => {
-                  val nfd = new FunDef(fd.id, fd.returnType, fd.args)
-                  nfd.fromLoop = fd.fromLoop
-                  nfd.parent = fd.parent
-                  nfd.precondition = Some(as(1))
-                  nfd.postcondition = Some(as(2))
-                  LetDef(nfd, as(0))
+                  //val nfd = new FunDef(fd.id, fd.returnType, fd.args)
+                  //nfd.fromLoop = fd.fromLoop
+                  //nfd.parent = fd.parent
+                  //nfd.precondition = Some(as(1))
+                  //nfd.postcondition = Some(as(2))
+                  //LetDef(nfd, as(0))
+                  fd.precondition = Some(as(1))
+                  fd.postcondition = Some(as(2))
+                  LetDef(fd, as(0))
                 }))
           }
       }
diff --git a/src/test/resources/regression/verification/xlang/invalid/Array1.scala b/src/test/resources/regression/verification/xlang/invalid/Array1.scala
new file mode 100644
index 000000000..a8451250c
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Array1.scala
@@ -0,0 +1,9 @@
+object Array1 {
+
+  def foo(): Int = {
+    val a = Array.fill(5)(0)
+    a(2) = 3
+    a(2)
+  } ensuring(_ == 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Array2.scala b/src/test/resources/regression/verification/xlang/invalid/Array2.scala
new file mode 100644
index 000000000..54ab5e3c2
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Array2.scala
@@ -0,0 +1,9 @@
+object Array2 {
+
+  def foo(): Int = {
+    val a = Array.fill(5)(0)
+    a(2) = 3
+    a.length
+  } ensuring(_ == 4)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Array3.scala b/src/test/resources/regression/verification/xlang/invalid/Array3.scala
new file mode 100644
index 000000000..0c1bb76fd
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Array3.scala
@@ -0,0 +1,16 @@
+import leon.Utils._
+
+object Array3 {
+
+  def foo(): Int = {
+    val a = Array.fill(5)(3)
+    var i = 0
+    var sum = 0
+    (while(i <= a.length) {
+      sum = sum + a(i)
+      i = i + 1
+    }) invariant(i >= 0)
+    sum
+  } ensuring(_ == 15)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Array4.scala b/src/test/resources/regression/verification/xlang/invalid/Array4.scala
new file mode 100644
index 000000000..5b5e74061
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Array4.scala
@@ -0,0 +1,9 @@
+import leon.Utils._
+
+object Array4 {
+
+  def foo(a: Array[Int]): Int = {
+    a(2)
+  }
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Array5.scala b/src/test/resources/regression/verification/xlang/invalid/Array5.scala
new file mode 100644
index 000000000..ecb003349
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Array5.scala
@@ -0,0 +1,10 @@
+import leon.Utils._
+
+object Array4 {
+
+  def foo(a: Array[Int]): Int = {
+    require(a.length > 2)
+    a(2)
+  } ensuring(_ == 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Epsilon1.scala b/src/test/resources/regression/verification/xlang/invalid/Epsilon1.scala
new file mode 100644
index 000000000..c3c0a48be
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Epsilon1.scala
@@ -0,0 +1,12 @@
+import leon.Utils._
+
+object Epsilon1 {
+
+  def rand2(x: Int): Int = epsilon((y: Int) => true)
+
+  //this should not hold
+  def property2(x: Int): Boolean = {
+    rand2(x) == rand2(x+1) 
+  } holds
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Epsilon2.scala b/src/test/resources/regression/verification/xlang/invalid/Epsilon2.scala
new file mode 100644
index 000000000..20699fc42
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Epsilon2.scala
@@ -0,0 +1,11 @@
+import leon.Utils._
+
+object Epsilon1 {
+
+  def rand3(x: Int): Int = epsilon((y: Int) => x == x)
+
+  //this should not hold
+  def property3(x: Int): Boolean = {
+    rand3(x) == rand3(x+1)
+  } holds
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Epsilon3.scala b/src/test/resources/regression/verification/xlang/invalid/Epsilon3.scala
new file mode 100644
index 000000000..5ff47b6d6
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Epsilon3.scala
@@ -0,0 +1,9 @@
+import leon.Utils._
+
+object Epsilon3 {
+
+  def posWrong(): Int = {
+    epsilon((y: Int) => y >= 0)
+  } ensuring(_ > 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Epsilon4.scala b/src/test/resources/regression/verification/xlang/invalid/Epsilon4.scala
new file mode 100644
index 000000000..6619e59d6
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Epsilon4.scala
@@ -0,0 +1,27 @@
+import leon.Utils._
+
+object Epsilon4 {
+
+  sealed abstract class MyList
+  case class MyCons(head: Int, tail: MyList) extends MyList
+  case class MyNil() extends MyList
+
+  def size(lst: MyList): Int = (lst match {
+    case MyNil() => 0
+    case MyCons(_, xs) => 1 + size(xs)
+  })
+
+  def toSet(lst: MyList): Set[Int] = lst match {
+    case MyCons(x, xs) => toSet(xs) ++ Set(x)
+    case MyNil() => Set[Int]()
+  }
+
+  def toList(set: Set[Int]): MyList = if(set == Set.empty[Int]) MyNil() else {
+    val elem = epsilon((x : Int) => set contains x)
+    MyCons(elem, toList(set -- Set[Int](elem)))
+  }
+
+
+  def wrongProperty0(lst: MyList): Boolean = (size(toList(toSet(lst))) == size(lst)) holds
+  //def wrongProperty1(lst: MyList): Boolean = (toList(toSet(lst)) == lst) holds
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Epsilon5.scala b/src/test/resources/regression/verification/xlang/invalid/Epsilon5.scala
new file mode 100644
index 000000000..b96fa7564
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Epsilon5.scala
@@ -0,0 +1,9 @@
+import leon.Utils._
+
+object Epsilon5 {
+
+  def fooWrong(x: Int, y: Int): Int = {
+    epsilon((z: Int) => z >= x && z <= y)
+  } ensuring(_ > x)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Epsilon6.scala b/src/test/resources/regression/verification/xlang/invalid/Epsilon6.scala
new file mode 100644
index 000000000..bc5aca78c
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Epsilon6.scala
@@ -0,0 +1,9 @@
+import leon.Utils._
+
+object Epsilon6 {
+
+  def greaterWrong(x: Int): Int = {
+    epsilon((y: Int) => y >= x)
+  } ensuring(_ > x)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/IfExpr2.scala b/src/test/resources/regression/verification/xlang/invalid/IfExpr2.scala
new file mode 100644
index 000000000..1284904b5
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/IfExpr2.scala
@@ -0,0 +1,14 @@
+object IfExpr2 {
+
+  def foo(): Int = {
+    var a = 1
+    var b = 2
+    if(a < b) {
+      a = a + 3
+      b = b + 2
+      a = a + b
+    }
+    a
+  } ensuring(_ == 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/MyTuple1.scala b/src/test/resources/regression/verification/xlang/invalid/MyTuple1.scala
new file mode 100644
index 000000000..f2b06b5b2
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/MyTuple1.scala
@@ -0,0 +1,11 @@
+object MyTuple1 {
+
+  def foo(): Int = {
+    val t = (1, true, 3)
+    val a1 = t._1
+    val a2 = t._2
+    val a3 = t._3
+    a3
+  } ensuring( _ == 1)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/MyTuple2.scala b/src/test/resources/regression/verification/xlang/invalid/MyTuple2.scala
new file mode 100644
index 000000000..22b62dc75
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/MyTuple2.scala
@@ -0,0 +1,14 @@
+object MyTuple2 {
+
+  abstract class A
+  case class B(i: Int) extends A
+  case class C(a: A) extends A
+
+  def foo(): Int = {
+    val t = (B(2), C(B(3)))
+    t match {
+      case (B(x), C(y)) => x
+    }
+  } ensuring( _ == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/MyTuple3.scala b/src/test/resources/regression/verification/xlang/invalid/MyTuple3.scala
new file mode 100644
index 000000000..da9f85b16
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/MyTuple3.scala
@@ -0,0 +1,7 @@
+object MyTuple3 {
+
+  def foo(t: (Int, Int)): (Int, Int) = {
+    t
+  } ensuring(res => res._1 > 0 && res._2 > 1)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/invalid/Unit1.scala b/src/test/resources/regression/verification/xlang/invalid/Unit1.scala
new file mode 100644
index 000000000..789a8f058
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/invalid/Unit1.scala
@@ -0,0 +1,7 @@
+object Unit1 {
+
+  def foo(u: Unit): Unit = ({
+    u
+  }) ensuring(_ != ())
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array1.scala b/src/test/resources/regression/verification/xlang/valid/Array1.scala
new file mode 100644
index 000000000..3815f0344
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array1.scala
@@ -0,0 +1,9 @@
+object Array1 {
+
+  def foo(): Int = {
+    val a = Array.fill(5)(0)
+    a(2) = 3
+    a(2)
+  } ensuring(_ == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array10.scala b/src/test/resources/regression/verification/xlang/valid/Array10.scala
new file mode 100644
index 000000000..ebb60ad6e
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array10.scala
@@ -0,0 +1,9 @@
+object Array10 {
+
+  def foo(a: Array[Int]): Int = {
+    require(a.length > 0)
+    val b = a.clone
+    b(0)
+  } ensuring(res => res == a(0))
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array2.scala b/src/test/resources/regression/verification/xlang/valid/Array2.scala
new file mode 100644
index 000000000..4f149a930
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array2.scala
@@ -0,0 +1,9 @@
+object Array2 {
+
+  def foo(): Int = {
+    val a = Array.fill(5)(0)
+    a(2) = 3
+    a.length
+  } ensuring(_ == 5)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array3.scala b/src/test/resources/regression/verification/xlang/valid/Array3.scala
new file mode 100644
index 000000000..bbb1845b8
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array3.scala
@@ -0,0 +1,16 @@
+import leon.Utils._
+
+object Array3 {
+
+  def foo(): Int = {
+    val a = Array.fill(5)(3)
+    var i = 0
+    var sum = 0
+    (while(i < a.length) {
+      sum = sum + a(i)
+      i = i + 1
+    }) invariant(i >= 0)
+    sum
+  } ensuring(_ == 15)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array4.scala b/src/test/resources/regression/verification/xlang/valid/Array4.scala
new file mode 100644
index 000000000..fd76e02fa
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array4.scala
@@ -0,0 +1,15 @@
+import leon.Utils._
+
+object Array4 {
+
+  def foo(a: Array[Int]): Int = {
+    var i = 0
+    var sum = 0
+    (while(i < a.length) {
+      sum = sum + a(i)
+      i = i + 1
+    }) invariant(i >= 0)
+    sum
+  }
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array5.scala b/src/test/resources/regression/verification/xlang/valid/Array5.scala
new file mode 100644
index 000000000..14bed6eff
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array5.scala
@@ -0,0 +1,20 @@
+import leon.Utils._
+
+object Array5 {
+
+  def foo(a: Array[Int]): Int = {
+    var i = 0
+    var sum = 0
+    (while(i < a.length) {
+      sum = sum + a(i)
+      i = i + 1
+    }) invariant(i >= 0)
+    sum
+  }
+
+  def bar(): Int = {
+    val a = Array.fill(5)(5)
+    foo(a)
+  }
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array6.scala b/src/test/resources/regression/verification/xlang/valid/Array6.scala
new file mode 100644
index 000000000..bdd6b0c5d
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array6.scala
@@ -0,0 +1,15 @@
+import leon.Utils._
+
+object Array6 {
+
+  def foo(a: Array[Int]): Int = {
+    require(a.length > 2 && a(2) == 5)
+    a(2)
+  } ensuring(_ == 5)
+
+  def bar(): Int = {
+    val a = Array.fill(5)(5)
+    foo(a)
+  }
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array7.scala b/src/test/resources/regression/verification/xlang/valid/Array7.scala
new file mode 100644
index 000000000..55bbbb729
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array7.scala
@@ -0,0 +1,17 @@
+import leon.Utils._
+
+object Array7 {
+
+  def foo(a: Array[Int]): Array[Int] = {
+    require(a.length > 0)
+    val a2 = Array.fill(a.length)(0)
+    var i = 0
+    (while(i < a.length) {
+      a2(i) = a(i)
+      i = i + 1
+    }) invariant(a.length == a2.length && i >= 0 && (if(i > 0) a2(0) == a(0) else true))
+    a2
+  } ensuring(_(0) == a(0))
+
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array8.scala b/src/test/resources/regression/verification/xlang/valid/Array8.scala
new file mode 100644
index 000000000..270b18122
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array8.scala
@@ -0,0 +1,8 @@
+object Array8 {
+
+  def foo(a: Array[Int]): Array[Int] = {
+    require(a.length >= 2)
+    a.updated(1, 3)
+  } ensuring(res => res.length == a.length && res(1) == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Array9.scala b/src/test/resources/regression/verification/xlang/valid/Array9.scala
new file mode 100644
index 000000000..f49333236
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Array9.scala
@@ -0,0 +1,15 @@
+object Array9 {
+
+  def foo(i: Int): Array[Int] = {
+    require(i > 0)
+    val a = Array.fill(i)(0)
+    a
+  } ensuring(res => res.length == i)
+
+  def bar(i: Int): Int = {
+    require(i > 0)
+    val b = foo(i)
+    b(0)
+  }
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Assign1.scala b/src/test/resources/regression/verification/xlang/valid/Assign1.scala
new file mode 100644
index 000000000..0506c6afb
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Assign1.scala
@@ -0,0 +1,12 @@
+object Assign1 {
+
+  def foo(): Int = {
+    var a = 0
+    val tmp = a + 1
+    a = a + 2
+    a = a + tmp
+    a = a + 4
+    a
+  } ensuring(_ == 7)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Epsilon1.scala b/src/test/resources/regression/verification/xlang/valid/Epsilon1.scala
new file mode 100644
index 000000000..2ae7201dd
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Epsilon1.scala
@@ -0,0 +1,9 @@
+import leon.Utils._
+
+object Epsilon1 {
+
+  def greater(x: Int): Int = {
+    epsilon((y: Int) => y > x)
+  } ensuring(_ >= x)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Epsilon2.scala b/src/test/resources/regression/verification/xlang/valid/Epsilon2.scala
new file mode 100644
index 000000000..36e5268e2
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Epsilon2.scala
@@ -0,0 +1,13 @@
+import leon.Utils._
+
+object Epsilon1 {
+
+  def rand(): Int = epsilon((x: Int) => true)
+
+  //this should hold, that is the expected semantic of our epsilon
+  def property1(): Boolean = {
+    rand() == rand() 
+  } holds
+
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Epsilon3.scala b/src/test/resources/regression/verification/xlang/valid/Epsilon3.scala
new file mode 100644
index 000000000..f652016d2
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Epsilon3.scala
@@ -0,0 +1,9 @@
+import leon.Utils._
+
+object Epsilon3 {
+
+  def pos(): Int = {
+    epsilon((y: Int) => y > 0)
+  } ensuring(_ >= 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Epsilon4.scala b/src/test/resources/regression/verification/xlang/valid/Epsilon4.scala
new file mode 100644
index 000000000..174042863
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Epsilon4.scala
@@ -0,0 +1,32 @@
+import leon.Utils._
+
+object Epsilon4 {
+
+  sealed abstract class MyList
+  case class MyCons(head: Int, tail: MyList) extends MyList
+  case class MyNil() extends MyList
+
+  def size(lst: MyList): Int = (lst match {
+    case MyNil() => 0
+    case MyCons(_, xs) => 1 + size(xs)
+  })
+
+  def toSet(lst: MyList): Set[Int] = lst match {
+    case MyCons(x, xs) => toSet(xs) ++ Set(x)
+    case MyNil() => Set[Int]()
+  }
+
+  def toList(set: Set[Int]): MyList = if(set == Set.empty[Int]) MyNil() else {
+    val elem = epsilon((x : Int) => set contains x)
+    MyCons(elem, toList(set -- Set[Int](elem)))
+  }
+
+  //timeout, but this probably means that it is valid as expected
+  //def property(lst: MyList): Boolean = (size(toList(toSet(lst))) <= size(lst)) holds
+
+  def propertyBase(lst: MyList): Boolean = ({
+    require(lst match { case MyNil() => true case _ => false})
+    size(toList(toSet(lst))) <= size(lst) 
+  }) holds
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Epsilon5.scala b/src/test/resources/regression/verification/xlang/valid/Epsilon5.scala
new file mode 100644
index 000000000..0427cf086
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Epsilon5.scala
@@ -0,0 +1,9 @@
+import leon.Utils._
+
+object Epsilon5 {
+
+  def foo(x: Int, y: Int): Int = {
+    epsilon((z: Int) => z > x && z < y)
+  } ensuring(_ >= x)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Field1.scala b/src/test/resources/regression/verification/xlang/valid/Field1.scala
new file mode 100644
index 000000000..116557ab7
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Field1.scala
@@ -0,0 +1,11 @@
+object Field1 {
+
+  abstract sealed class A
+  case class B(size: Int) extends A
+
+  def foo(): Int = {
+    val b = B(3)
+    b.size
+  } ensuring(_ == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Field2.scala b/src/test/resources/regression/verification/xlang/valid/Field2.scala
new file mode 100644
index 000000000..9a9661023
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Field2.scala
@@ -0,0 +1,11 @@
+object Field2 {
+
+  abstract sealed class A
+  case class B(length: Int) extends A
+
+  def foo(): Int = {
+    val b = B(3)
+    b.length
+  } ensuring(_ == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/IfExpr1.scala b/src/test/resources/regression/verification/xlang/valid/IfExpr1.scala
new file mode 100644
index 000000000..82db13d52
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/IfExpr1.scala
@@ -0,0 +1,13 @@
+object IfExpr1 {
+
+  def foo(): Int = {
+    var a = 1
+    var b = 2
+    if({a = a + 1; a != b})
+      a = a + 3
+    else
+      b = a + b
+    a
+  } ensuring(_ == 2)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/IfExpr2.scala b/src/test/resources/regression/verification/xlang/valid/IfExpr2.scala
new file mode 100644
index 000000000..7a681bc72
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/IfExpr2.scala
@@ -0,0 +1,14 @@
+object IfExpr2 {
+
+  def foo(): Int = {
+    var a = 1
+    var b = 2
+    if(a < b) {
+      a = a + 3
+      b = b + 2
+      a = a + b
+    }
+    a
+  } ensuring(_ == 8)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/IfExpr3.scala b/src/test/resources/regression/verification/xlang/valid/IfExpr3.scala
new file mode 100644
index 000000000..86d4e494a
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/IfExpr3.scala
@@ -0,0 +1,19 @@
+object IfExpr1 {
+
+  def foo(a: Int): Int = {
+
+    if(a > 0) {
+      var a = 1
+      var b = 2
+      a = 3
+      a + b
+    } else {
+      5
+      //var a = 3
+      //var b = 1
+      //b = b + 1
+      //a + b
+    }
+  } ensuring(_ == 5)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/IfExpr4.scala b/src/test/resources/regression/verification/xlang/valid/IfExpr4.scala
new file mode 100644
index 000000000..94b99fde3
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/IfExpr4.scala
@@ -0,0 +1,18 @@
+object IfExpr4 {
+
+  def foo(a: Int): Int = {
+
+    if(a > 0) {
+      var a = 1
+      var b = 2
+      a = 3
+      a + b
+    } else {
+      var a = 3
+      var b = 1
+      b = b + 1
+      a + b
+    }
+  } ensuring(_ == 5)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/InstanceOf1.scala b/src/test/resources/regression/verification/xlang/valid/InstanceOf1.scala
new file mode 100644
index 000000000..1c52338bb
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/InstanceOf1.scala
@@ -0,0 +1,18 @@
+object InstanceOf1 {
+
+  abstract class A
+  case class B(i: Int) extends A
+  case class C(i: Int) extends A
+
+  def foo(): Int = {
+    require(C(3).isInstanceOf[C])
+    val b: A = B(2)
+    if(b.isInstanceOf[B])
+      0
+    else
+      -1
+  } ensuring(_ == 0)
+
+  def bar(): Int = foo()
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/MyTuple3.scala b/src/test/resources/regression/verification/xlang/valid/MyTuple3.scala
new file mode 100644
index 000000000..2e14c067b
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/MyTuple3.scala
@@ -0,0 +1,8 @@
+object MyTuple3 {
+
+  def foo(): Int = {
+    val t = ((2, 3), true)
+    t._1._2
+  } ensuring( _ == 3)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/MyTuple4.scala b/src/test/resources/regression/verification/xlang/valid/MyTuple4.scala
new file mode 100644
index 000000000..6fcfed661
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/MyTuple4.scala
@@ -0,0 +1,14 @@
+
+object MyTuple4 {
+
+  abstract class A
+  case class B(i: Int) extends A
+  case class C(a: A) extends A
+
+  def foo(): Int = {
+    val t = (1, (C(B(4)), 2), 3)
+    val (a1, (C(B(x)), a2), a3) = t
+    x
+  } ensuring( _ == 4)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/MyTuple5.scala b/src/test/resources/regression/verification/xlang/valid/MyTuple5.scala
new file mode 100644
index 000000000..6a55bc8c9
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/MyTuple5.scala
@@ -0,0 +1,16 @@
+object MyTuple1 {
+
+  abstract class A
+  case class B(t: (Int, Int)) extends A
+  case class C(a: A) extends A
+
+  def foo(): Int = {
+    val t: (Int, (A, Int), Int) = (1, (C(B((4, 5))), 2), 3)
+    t match {
+      case (_, (B((x, y)), _), _) => x
+      case (_, (C(B((_, x))), _), y) => x
+      case (_, _, x) => x
+    }
+  } ensuring( _ == 5)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/MyTuple6.scala b/src/test/resources/regression/verification/xlang/valid/MyTuple6.scala
new file mode 100644
index 000000000..a54710fbb
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/MyTuple6.scala
@@ -0,0 +1,8 @@
+object MyTuple6 {
+
+  def foo(t: (Int, Int)): (Int, Int) = {
+    require(t._1 > 0 && t._2 > 1)
+    t
+  } ensuring(res => res._1 > 0 && res._2 > 1)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested1.scala b/src/test/resources/regression/verification/xlang/valid/Nested1.scala
new file mode 100644
index 000000000..7745f794f
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested1.scala
@@ -0,0 +1,15 @@
+object Nested1 {
+
+  def foo(i: Int): Int = {
+    val n = 2
+    def rec1(j: Int) = i + j + n
+    def rec2(j: Int) = {
+      def rec3(k: Int) = k + j + i
+      rec3(5)
+    }
+    rec2(2)
+  } ensuring(i + 7 == _)
+
+}
+
+// vim: set ts=4 sw=4 et:
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested10.scala b/src/test/resources/regression/verification/xlang/valid/Nested10.scala
new file mode 100644
index 000000000..b3c4f8653
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested10.scala
@@ -0,0 +1,14 @@
+object Nested10 {
+
+  def foo(i: Int): Int = {
+    val n = 2
+    def rec1(j: Int) = {
+      i + j + n
+    }
+    def rec2(j: Int) = {
+      rec1(j)
+    }
+    rec2(2)
+  } ensuring(i + 4 == _)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested11.scala b/src/test/resources/regression/verification/xlang/valid/Nested11.scala
new file mode 100644
index 000000000..0316fc5f2
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested11.scala
@@ -0,0 +1,14 @@
+object Nested11 {
+
+  abstract class A
+  case class B(b: Int) extends A
+
+  def foo(i: Int): Int = {
+    val b: A = B(3)
+    def rec1(j: Int) = b match {
+      case B(b) => i + j + b
+    }
+    rec1(2)
+  } ensuring(i + 5 == _)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested12.scala b/src/test/resources/regression/verification/xlang/valid/Nested12.scala
new file mode 100644
index 000000000..05ac1569f
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested12.scala
@@ -0,0 +1,17 @@
+object Nested12 {
+
+  abstract class A
+  case class B(b: Int) extends A
+
+  def foo(i: Int): Int = {
+    val b: A = B(3)
+    def rec1(a: A, j: Int, j2: Int) = a match {
+      case B(b) => i + j + j2 + b
+    }
+    def rec2(a: A, k: Int) = a match {
+      case B(b) => rec1(a, b, k)
+    }
+    rec2(b, 2)
+  } ensuring(i + 8 == _)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested13.scala b/src/test/resources/regression/verification/xlang/valid/Nested13.scala
new file mode 100644
index 000000000..ccb742494
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested13.scala
@@ -0,0 +1,21 @@
+object Nested13 {
+
+  abstract class D
+  case class E(e: Int) extends D
+  case class F(d: D, f: Int) extends D
+
+  def foo(a : Int): Int = {
+
+    def rec1(d: D, j: Int): Int = d match {
+      case E(e) => j + e + a
+      case F(dNext, f) => f + rec1(dNext, j)
+    }
+
+    def rec2(d: D, i : Int) : Int = d match {
+      case E(e) => e
+      case F(dNext, f) => rec1(d, i)
+    }
+
+    rec2(F(E(2), 3), 0)
+  } ensuring(a + 5 == _)
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested14.scala b/src/test/resources/regression/verification/xlang/valid/Nested14.scala
new file mode 100644
index 000000000..9a79a4f6e
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested14.scala
@@ -0,0 +1,11 @@
+object Nested14 {
+
+  def foo(i: Int): Int = {
+    def rec1(j: Int): Int = {
+      def rec2(k: Int): Int = if(k == 0) 0 else rec1(j-1)
+      rec2(j)
+    }
+    rec1(3)
+  } ensuring(0 == _)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested2.scala b/src/test/resources/regression/verification/xlang/valid/Nested2.scala
new file mode 100644
index 000000000..cc7220b02
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested2.scala
@@ -0,0 +1,13 @@
+object Nested2 {
+
+  def foo(a: Int): Int = {
+    require(a >= 0)
+    val b = a + 2
+    def rec1(c: Int): Int = {
+      require(c >= 0)
+      b + c
+    }
+    rec1(2)
+  } ensuring(_ > 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested3.scala b/src/test/resources/regression/verification/xlang/valid/Nested3.scala
new file mode 100644
index 000000000..be6e6d04a
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested3.scala
@@ -0,0 +1,15 @@
+object Nested3 {
+
+  def foo(a: Int): Int = {
+    require(a >= 0 && a <= 50)
+    val b = a + 2
+    val c = a + b
+    def rec1(d: Int): Int = {
+      require(d >= 0 && d <= 50)
+      val e = d + b + c
+      e
+    }
+    rec1(2)
+  } ensuring(_ > 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested4.scala b/src/test/resources/regression/verification/xlang/valid/Nested4.scala
new file mode 100644
index 000000000..ea1e6066c
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested4.scala
@@ -0,0 +1,19 @@
+object Nested4 {
+
+  def foo(a: Int, a2: Int): Int = {
+    require(a >= 0 && a <= 50)
+    val b = a + 2
+    val c = a + b
+    if(a2 > a) {
+      def rec1(d: Int): Int = {
+        require(d >= 0 && d <= 50)
+        val e = d + b + c + a2
+        e
+      } ensuring(_ > 0)
+      rec1(2)
+    } else {
+      5
+    }
+  } ensuring(_ > 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested5.scala b/src/test/resources/regression/verification/xlang/valid/Nested5.scala
new file mode 100644
index 000000000..6ba128f41
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested5.scala
@@ -0,0 +1,12 @@
+object Nested5 {
+
+  def foo(a: Int): Int = {
+    require(a >= 0)
+    def bar(b: Int): Int = {
+      require(b > 0)
+      b + 3
+    } ensuring(a >= 0 && _ == b + 3)
+    bar(2)
+  } ensuring(a >= 0 && _ == 5)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested6.scala b/src/test/resources/regression/verification/xlang/valid/Nested6.scala
new file mode 100644
index 000000000..1c0220c04
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested6.scala
@@ -0,0 +1,14 @@
+object Nested5 {
+
+  def foo(a: Int): Int = {
+    require(a >= 0)
+    def bar(b: Int): Int = {
+      require(b > 0)
+      b + 3
+    } ensuring(prop(a, b) && a >= 0 && _ == b + 3)
+    bar(2)
+  } ensuring(a >= 0 && _ == 5)
+
+  def prop(x: Int, y: Int): Boolean = x + y > 0
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested7.scala b/src/test/resources/regression/verification/xlang/valid/Nested7.scala
new file mode 100644
index 000000000..62f5a567f
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested7.scala
@@ -0,0 +1,19 @@
+object Nested2 {
+
+  def foo(a: Int): Int = {
+    require(a >= 0)
+    val b = a + 2
+    def rec1(c: Int): Int = {
+      require(c >= 0)
+      b + c + bar(a) + bar(b) + bar(c)
+    }
+    rec1(2) + bar(a)
+  } ensuring(_ > 0)
+
+
+  def bar(x: Int): Int = {
+    require(x >= 0)
+    x
+  } ensuring(_ >= 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested8.scala b/src/test/resources/regression/verification/xlang/valid/Nested8.scala
new file mode 100644
index 000000000..e8a05e40e
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested8.scala
@@ -0,0 +1,43 @@
+import leon.Utils._
+
+object Nested8 {
+
+  def foo(a: Int): Int = {
+    require(a > 0)
+
+    def bar(b: Int): Int = {
+      if(a < b) {
+        def rec(c: Int): Int = {
+          require(c > 0)
+          c + b
+        } ensuring(_ > 0)
+        rec(2)
+      } else 3
+    }
+    bar(1)
+  } ensuring(_ > 0)
+
+  /*
+  def partitioned(a: Map[Int, Int], size: Int, l1: Int, u1: Int, l2: Int, u2: Int): Boolean = {
+    require(l1 >= 0 && u1 < l2 && u2 < size)
+    if(l2 > u2 || l1 > u1)
+      true
+    else {
+      var i = l1
+      var j = l2
+      var isPartitionned = true
+      (while(i <= u1) {
+        j = l2
+        (while(j <= u2) {
+          if(a(i) > a(j))
+            isPartitionned = false
+          j = j + 1
+        }) invariant(j >= l2 && i <= u1)
+        i = i + 1
+      }) invariant(i >= l1)
+      isPartitionned
+    }
+  }
+  */
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Nested9.scala b/src/test/resources/regression/verification/xlang/valid/Nested9.scala
new file mode 100644
index 000000000..3344a2c79
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Nested9.scala
@@ -0,0 +1,23 @@
+object Nested4 {
+
+  def foo(a: Int, a2: Int): Int = {
+    require(a >= 0 && a <= 50)
+    val b = a + 2
+    val c = a + b
+    if(a2 > a) {
+      def rec1(d: Int): Int = {
+        require(d >= 0 && d <= 50)
+        val e = d + b + c + a2
+        def rec2(f: Int): Int = {
+          require(f >= c)
+          f + e
+        } ensuring(_ > 0)
+        rec2(c+1)
+      } ensuring(_ > 0)
+      rec1(2)
+    } else {
+      5
+    }
+  } ensuring(_ > 0)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/NestedVar.scala b/src/test/resources/regression/verification/xlang/valid/NestedVar.scala
new file mode 100644
index 000000000..a26b7312b
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/NestedVar.scala
@@ -0,0 +1,17 @@
+object NestedVar {
+
+  def foo(): Int = {
+    val a = 3
+    def rec(x: Int): Int = {
+      var b = 3
+      var c = 3
+      if(x > 0)
+        b = 2
+      else
+        c = 2
+      c+b
+    }
+    rec(a)
+  } ensuring(_ == 5)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Unit1.scala b/src/test/resources/regression/verification/xlang/valid/Unit1.scala
new file mode 100644
index 000000000..a7b890d76
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Unit1.scala
@@ -0,0 +1,7 @@
+object Unit1 {
+
+  def foo(): Unit = ({
+    ()
+  }) ensuring(_ == ())
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/Unit2.scala b/src/test/resources/regression/verification/xlang/valid/Unit2.scala
new file mode 100644
index 000000000..ac659589a
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/Unit2.scala
@@ -0,0 +1,7 @@
+object Unit2 {
+
+  def foo(u: Unit): Unit = {
+    u
+  } ensuring(_ == ())
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/While1.scala b/src/test/resources/regression/verification/xlang/valid/While1.scala
new file mode 100644
index 000000000..0d868b399
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/While1.scala
@@ -0,0 +1,13 @@
+object While1 {
+
+  def foo(): Int = {
+    var a = 0
+    var i = 0
+    while(i < 10) {
+      a = a + 1
+      i = i + 1
+    }
+    a
+  } ensuring(_ == 10)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/While2.scala b/src/test/resources/regression/verification/xlang/valid/While2.scala
new file mode 100644
index 000000000..e841ed40e
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/While2.scala
@@ -0,0 +1,13 @@
+object While1 {
+
+  def foo(): Int = {
+    var a = 0
+    var i = 0
+    while(i < 10) {
+      a = a + i
+      i = i + 1
+    }
+    a
+  } ensuring(_ == 45)
+
+}
diff --git a/src/test/resources/regression/verification/xlang/valid/While3.scala b/src/test/resources/regression/verification/xlang/valid/While3.scala
new file mode 100644
index 000000000..da85d5dfa
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/While3.scala
@@ -0,0 +1,13 @@
+object While3 {
+
+  def foo(): Int = {
+    var a = 0
+    var i = 0
+    while({i = i+2; i <= 10}) {
+      a = a + i
+      i = i - 1
+    }
+    a
+  } ensuring(_ == 54)
+
+}
-- 
GitLab