From d47515b8b7b4fbcfc19ccade8ca0e767125a3010 Mon Sep 17 00:00:00 2001
From: Regis Blanc <regwblanc@gmail.com>
Date: Fri, 23 Oct 2015 13:18:28 +0200
Subject: [PATCH] fix

---
 .../leon/xlang/ImperativeCodeElimination.scala  |  4 ++--
 .../xlang/valid/FunInvocEvaluationOrder3.scala  | 17 +++++++++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)
 create mode 100644 src/test/resources/regression/verification/xlang/valid/FunInvocEvaluationOrder3.scala

diff --git a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
index 989942f22..7ab5925ce 100644
--- a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
+++ b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala
@@ -242,7 +242,7 @@ object ImperativeCodeElimination extends UnitPhase[Program] {
         val fd = tfd.fd
         state.funDefsMapping.get(fd) match { 
           case Some((newFd, modifiedVars)) => {
-            val newInvoc = FunctionInvocation(newFd.typed, args ++ modifiedVars.map(id => id.toVariable)).setPos(fi)
+            val newInvoc = FunctionInvocation(newFd.typed, recArgs ++ modifiedVars.map(id => id.toVariable)).setPos(fi)
             val freshNames = modifiedVars.map(id => id.freshen)
             val tmpTuple = FreshIdentifier("t", newFd.returnType)
 
@@ -252,7 +252,7 @@ object ImperativeCodeElimination extends UnitPhase[Program] {
                   Let(p._1, TupleSelect(tmpTuple.toVariable, p._2 + 2), b))
               ))
             }
-            val newMap = modifiedVars.zip(freshNames).toMap ++ argFun
+            val newMap = argFun ++ modifiedVars.zip(freshNames).toMap
 
             (TupleSelect(tmpTuple.toVariable, 1), scope, newMap)
           }
diff --git a/src/test/resources/regression/verification/xlang/valid/FunInvocEvaluationOrder3.scala b/src/test/resources/regression/verification/xlang/valid/FunInvocEvaluationOrder3.scala
new file mode 100644
index 000000000..f26352965
--- /dev/null
+++ b/src/test/resources/regression/verification/xlang/valid/FunInvocEvaluationOrder3.scala
@@ -0,0 +1,17 @@
+object FunInvocEvaluationOrder3 {
+
+  def leftToRight(n: BigInt): BigInt = {
+    require(n > 0)
+
+    var a = BigInt(0)
+
+    def nested(x: BigInt, y: BigInt): Unit = {
+      a = x + y
+    }
+
+    nested({a += 10; a}, {a *= 2; a})
+    a
+
+  } ensuring(_ == 30)
+
+}
-- 
GitLab