From 4b5362ddd20ede386d5be877176f0409af2d0ba3 Mon Sep 17 00:00:00 2001 From: Regis Blanc <regwblanc@gmail.com> Date: Wed, 13 Jan 2016 17:25:39 +0100 Subject: [PATCH] first batch of tests for array mutation --- build.sbt | 4 ++-- .../scala/leon/xlang/AntiAliasingPhase.scala | 2 -- .../xlang/valid/ArrayParamMutation1.scala | 16 +++++++++++++ .../xlang/valid/ArrayParamMutation2.scala | 16 +++++++++++++ .../xlang/valid/ArrayParamMutation3.scala | 23 +++++++++++++++++++ .../xlang/valid/ArrayParamMutation4.scala | 23 +++++++++++++++++++ .../xlang/valid/ArrayParamMutation5.scala | 21 +++++++++++++++++ .../xlang/valid/ArrayParamMutation6.scala | 16 +++++++++++++ 8 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/regression/verification/xlang/valid/ArrayParamMutation1.scala create mode 100644 src/test/resources/regression/verification/xlang/valid/ArrayParamMutation2.scala create mode 100644 src/test/resources/regression/verification/xlang/valid/ArrayParamMutation3.scala create mode 100644 src/test/resources/regression/verification/xlang/valid/ArrayParamMutation4.scala create mode 100644 src/test/resources/regression/verification/xlang/valid/ArrayParamMutation5.scala create mode 100644 src/test/resources/regression/verification/xlang/valid/ArrayParamMutation6.scala diff --git a/build.sbt b/build.sbt index 0e3e147a1..4ecb2f93a 100644 --- a/build.sbt +++ b/build.sbt @@ -109,8 +109,8 @@ Keys.fork in run := true lazy val testSettings = Seq( //Keys.fork := true, - logBuffered := true, - parallelExecution := true + logBuffered := false, + parallelExecution := false //testForkedParallel := true, //javaOptions ++= Seq("-Xss64M", "-Xmx4G") ) diff --git a/src/main/scala/leon/xlang/AntiAliasingPhase.scala b/src/main/scala/leon/xlang/AntiAliasingPhase.scala index a7adbfbaa..f9610904c 100644 --- a/src/main/scala/leon/xlang/AntiAliasingPhase.scala +++ b/src/main/scala/leon/xlang/AntiAliasingPhase.scala @@ -262,7 +262,6 @@ object AntiAliasingPhase extends TransformationPhase { } } - def invocEffects(fi: FunctionInvocation): Set[Identifier] = { if(!effects.isDefinedAt(fi.tfd.fd)) { println("fi not defined: " + fi) @@ -276,7 +275,6 @@ object AntiAliasingPhase extends TransformationPhase { }.toSet } - rec() effects } diff --git a/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation1.scala b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation1.scala new file mode 100644 index 000000000..f0e622c66 --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation1.scala @@ -0,0 +1,16 @@ +import leon.lang._ + +object ArrayParamMutation1 { + + def update(a: Array[BigInt]): Unit = { + require(a.length > 0) + a(0) = 10 + } + + def f(): BigInt = { + val a = Array.fill(10)(BigInt(0)) + update(a) + a(0) + } ensuring(res => res == 10) + +} diff --git a/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation2.scala b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation2.scala new file mode 100644 index 000000000..801b35e0c --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation2.scala @@ -0,0 +1,16 @@ +import leon.lang._ + +object ArrayParamMutation2 { + + def rec(a: Array[BigInt]): BigInt = { + require(a.length > 1 && a(0) >= 0) + if(a(0) == 0) + a(1) + else { + a(0) = a(0) - 1 + a(1) = a(1) + a(0) + rec(a) + } + } ensuring(res => a(0) == 0) + +} diff --git a/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation3.scala b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation3.scala new file mode 100644 index 000000000..f57516744 --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation3.scala @@ -0,0 +1,23 @@ +import leon.lang._ + +object ArrayParamMutation3 { + + def odd(a: Array[BigInt]): Boolean = { + require(a.length > 0 && a(0) >= 0) + if(a(0) == 0) false + else { + a(0) = a(0) - 1 + even(a) + } + } ensuring(res => a(0) == 0) + + def even(a: Array[BigInt]): Boolean = { + require(a.length > 0 && a(0) >= 0) + if(a(0) == 0) true + else { + a(0) = a(0) - 1 + odd(a) + } + } ensuring(res => a(0) == 0) + +} diff --git a/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation4.scala b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation4.scala new file mode 100644 index 000000000..31af4cd58 --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation4.scala @@ -0,0 +1,23 @@ +import leon.lang._ + +object ArrayParamMutation4 { + + def multipleArgs(a1: Array[BigInt], a2: Array[BigInt]): Unit = { + require(a1.length > 0 && a2.length > 0) + if(a1(0) == 10) + a2(0) = 13 + else + a2(0) = a1(0) + 1 + } + + def transitiveEffects(a1: Array[BigInt], a2: Array[BigInt]): Unit = { + require(a1.length > 0 && a2.length > 0) + multipleArgs(a1, a2) + } ensuring(_ => a2(0) >= a1(0)) + + def transitiveReverseEffects(a1: Array[BigInt], a2: Array[BigInt]): Unit = { + require(a1.length > 0 && a2.length > 0) + multipleArgs(a2, a1) + } ensuring(_ => a1(0) >= a2(0)) + +} diff --git a/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation5.scala b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation5.scala new file mode 100644 index 000000000..249a79d1f --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation5.scala @@ -0,0 +1,21 @@ + +import leon.lang._ + +object ArrayParamMutation5 { + + def mutuallyRec1(a1: Array[BigInt], a2: Array[BigInt]): Unit = { + require(a1.length > 0 && a1(0) > 0 && a2.length > 0) + if(a1(0) == 10) { + () + } else { + mutuallyRec2(a1, a2) + } + } ensuring(res => a1(0) == 10) + + def mutuallyRec2(a1: Array[BigInt], a2: Array[BigInt]): Unit = { + require(a1.length > 0 && a2.length > 0 && a1(0) > 0) + a1(0) = 10 + mutuallyRec1(a1, a2) + } + +} diff --git a/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation6.scala b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation6.scala new file mode 100644 index 000000000..29ded427f --- /dev/null +++ b/src/test/resources/regression/verification/xlang/valid/ArrayParamMutation6.scala @@ -0,0 +1,16 @@ +import leon.lang._ + +object ArrayParamMutation6 { + + def multipleEffects(a1: Array[BigInt], a2: Array[BigInt]): Unit = { + require(a1.length > 0 && a2.length > 0) + a1(0) = 11 + a2(0) = 12 + } ensuring(_ => a1(0) != a2(0)) + + def f(a1: Array[BigInt], a2: Array[BigInt]): Unit = { + require(a1.length > 0 && a2.length > 0) + multipleEffects(a1, a2) + } ensuring(_ => a1(0) == 11 && a2(0) == 12) + +} -- GitLab