From 7a5125138456e210fb47a1301e80e38542f594e2 Mon Sep 17 00:00:00 2001
From: Regis Blanc <regwblanc@gmail.com>
Date: Thu, 28 May 2015 16:51:40 +0200
Subject: [PATCH] fix while loop with complicated conditions

---
 .../xlang/ImperativeCodeElimination.scala     |  2 +-
 .../valid/WhileConditionSubexpression.scala   | 20 +++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)
 create mode 100644 src/test/resources/regression/verification/xlang/valid/WhileConditionSubexpression.scala

diff --git a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
index 8f26df8f4..7b340a12a 100644
--- a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
+++ b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
@@ -155,7 +155,7 @@ object ImperativeCodeElimination extends LeonPhase[Program, (Program, Set[FunDef
           val whileFunDef = new FunDef(FreshIdentifier(parent.id.name), Nil, whileFunReturnType, whileFunValDefs,DefType.MethodDef).setPos(wh)
           wasLoop += whileFunDef
           
-          val whileFunCond = condRes
+          val whileFunCond = condScope(condRes)
           val whileFunRecursiveCall = replaceNames(condFun,
             bodyScope(FunctionInvocation(whileFunDef.typed, modifiedVars.map(id => condBodyFun(id).toVariable)).setPos(wh)))
           val whileFunBaseCase =
diff --git a/src/test/resources/regression/verification/xlang/valid/WhileConditionSubexpression.scala b/src/test/resources/regression/verification/xlang/valid/WhileConditionSubexpression.scala
new file mode 100644
index 000000000..b57fc9d8b
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/WhileConditionSubexpression.scala
@@ -0,0 +1,20 @@
+import leon.lang._
+import leon.collection._
+import leon._
+
+import leon.lang._
+
+object WhileConditionSubexpression {
+
+  def test(x: Int): Boolean = {
+    var b = false
+    var i = 0
+    while(!b && i < 10) {
+      if(i == x)
+        b = true
+      i += 1
+    }
+    b
+  } ensuring(res => res || (x != 0 && x != 1 && x != 2))
+
+}
-- 
GitLab