From c6ec95788f0bbd0c66517fe6a4a49ab278e3e2d2 Mon Sep 17 00:00:00 2001 From: Regis Blanc <regwblanc@gmail.com> Date: Wed, 6 Apr 2016 18:40:49 +0200 Subject: [PATCH] xlang does not lift code outside of lambdas --- .../leon/xlang/ImperativeCodeElimination.scala | 5 +++++ .../verification/xlang/valid/Lambda1.scala | 13 +++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/test/resources/regression/verification/xlang/valid/Lambda1.scala diff --git a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala index de75b7a29..3636fd6e5 100644 --- a/src/main/scala/leon/xlang/ImperativeCodeElimination.scala +++ b/src/main/scala/leon/xlang/ImperativeCodeElimination.scala @@ -304,6 +304,11 @@ object ImperativeCodeElimination extends UnitPhase[Program] { } } + //TODO: handle vars in scope, just like LetDef + case ld@Lambda(params, body) => + val (bodyVal, bodyScope, bodyFun) = toFunction(body) + (Lambda(params, bodyScope(bodyVal)).copiedFrom(ld), (e: Expr) => e, Map()) + case c @ Choose(b) => //Recall that Choose cannot mutate variables from the scope (c, (b2: Expr) => b2, Map()) diff --git a/src/test/resources/regression/verification/xlang/valid/Lambda1.scala b/src/test/resources/regression/verification/xlang/valid/Lambda1.scala new file mode 100644 index 000000000..b228f96f7 --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/Lambda1.scala @@ -0,0 +1,13 @@ +object Lambda1 { + + def test(): Int = { + val x = 2 + val cl = ((y: Int) => { + var z = y + z = z + x + z + }) + cl(4) + } ensuring(_ == 6) + +} -- GitLab