From bd41adafc0aab8a1e33550338d486f864b3e5e8d Mon Sep 17 00:00:00 2001 From: Regis Blanc <regwblanc@gmail.com> Date: Tue, 12 Apr 2016 16:57:55 +0200 Subject: [PATCH] Tree and def Transformers handle letdef and letvar --- .../purescala/DefinitionTransformer.scala | 6 ++++++ .../leon/purescala/TreeTransformer.scala | 4 ++++ .../scala/leon/xlang/AntiAliasingPhase.scala | 1 + .../xlang/valid/ExpressionOrder1.scala | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 src/test/resources/regression/verification/xlang/valid/ExpressionOrder1.scala diff --git a/src/main/scala/leon/purescala/DefinitionTransformer.scala b/src/main/scala/leon/purescala/DefinitionTransformer.scala index d0008e5b6..abe08fa34 100644 --- a/src/main/scala/leon/purescala/DefinitionTransformer.scala +++ b/src/main/scala/leon/purescala/DefinitionTransformer.scala @@ -34,6 +34,12 @@ class DefinitionTransformer( idMap += id -> nid nid }) + + case LetDef(fds, body) => + val rFds = fds map transform + val rBody = transform(body) + LetDef(rFds, rBody).copiedFrom(e) + case _ => super.transform(e) } diff --git a/src/main/scala/leon/purescala/TreeTransformer.scala b/src/main/scala/leon/purescala/TreeTransformer.scala index 77a5659f1..d74da4f8f 100644 --- a/src/main/scala/leon/purescala/TreeTransformer.scala +++ b/src/main/scala/leon/purescala/TreeTransformer.scala @@ -6,6 +6,7 @@ package purescala import Common._ import Definitions._ import Expressions._ +import xlang.Expressions._ import Extractors._ import Types._ @@ -34,6 +35,9 @@ trait TreeTransformer { case Let(a, expr, body) => val newA = transform(a) Let(newA, transform(expr), transform(body)(bindings + (a -> newA))).copiedFrom(e) + case LetVar(a, expr, body) => + val newA = transform(a) + LetVar(newA, transform(expr), transform(body)(bindings + (a -> newA))).copiedFrom(e) case CaseClass(cct, args) => CaseClass(transform(cct).asInstanceOf[CaseClassType], args map transform).copiedFrom(e) case CaseClassSelector(cct, caseClass, selector) => diff --git a/src/main/scala/leon/xlang/AntiAliasingPhase.scala b/src/main/scala/leon/xlang/AntiAliasingPhase.scala index b721a9472..063694add 100644 --- a/src/main/scala/leon/xlang/AntiAliasingPhase.scala +++ b/src/main/scala/leon/xlang/AntiAliasingPhase.scala @@ -84,6 +84,7 @@ object AntiAliasingPhase extends TransformationPhase { } { updatedFunctions += (fd -> updateFunDef(fd, effects)(ctx)) } + //println(updatedFunctions.filter(p => p._1.id != p._2.id).mkString("\n")) for { fd <- fds diff --git a/src/test/resources/regression/verification/xlang/valid/ExpressionOrder1.scala b/src/test/resources/regression/verification/xlang/valid/ExpressionOrder1.scala new file mode 100644 index 000000000..c34d2057e --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ExpressionOrder1.scala @@ -0,0 +1,19 @@ +/* Copyright 2009-2016 EPFL, Lausanne */ + +import leon.lang._ + +object NestedFunState8 { + + def test1 = { + var x = 0 + + def bar(y: Int) = { + def fun(z: Int) = 1 * x * (y + z) + + fun(3) + } + + bar(2) == 0 + }.holds + +} -- GitLab