From aa5eb2bbe9b0d9794b70ea8839cc4177975bff48 Mon Sep 17 00:00:00 2001
From: Regis Blanc <regwblanc@gmail.com>
Date: Tue, 17 Feb 2015 17:57:04 +0100
Subject: [PATCH] parsing bit vector constants from cvc4

---
 project/Build.scala                                             | 2 +-
 src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala           | 2 ++
 src/main/scala/leon/utils/TypingPhase.scala                     | 1 +
 .../regression/verification/purescala/invalid/Array3.scala      | 1 +
 4 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/project/Build.scala b/project/Build.scala
index 70c01e8e7..6d2daf152 100644
--- a/project/Build.scala
+++ b/project/Build.scala
@@ -80,6 +80,6 @@ object Leon extends Build {
     def project(repo: String, version: String) = RootProject(uri(s"${repo}#${version}"))
 
     lazy val bonsai      = project("git://github.com/colder/bonsai.git",     "0fec9f97f4220fa94b1f3f305f2e8b76a3cd1539")
-    lazy val scalaSmtLib = project("git://github.com/regb/scala-smtlib.git", "e721cf606f73c6ba41f7622c141a1eefef2c712d")
+    lazy val scalaSmtLib = project("git://github.com/regb/scala-smtlib.git", "8b37b5e95cd87093734ee342b484b1786c8c0bfe")
   }
 }
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
index 0c69b047b..98a129ce2 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
@@ -515,6 +515,7 @@ trait SMTLIBTarget {
     case (Core.True(), BooleanType)  => BooleanLiteral(true)
     case (Core.False(), BooleanType)  => BooleanLiteral(false)
 
+    case (FixedSizeBitVectors.BitVectorConstant(n, 32), Int32Type) => IntLiteral(n.toInt)
     case (SHexadecimal(hexa), Int32Type) => IntLiteral(hexa.toInt)
 
     case (SimpleSymbol(s), _: ClassType) if constructors.containsB(s) =>
@@ -553,6 +554,7 @@ trait SMTLIBTarget {
             FiniteArray(definedElements, Some(default), IntLiteral(size)).setType(at)
 
           } else {
+            println("size is: " + size)
             val entries = for (i <- 0 to size-1) yield elems.getOrElse(IntLiteral(i), default)
 
             FiniteArray(entries).setType(at)
diff --git a/src/main/scala/leon/utils/TypingPhase.scala b/src/main/scala/leon/utils/TypingPhase.scala
index 57f5c314e..61eb37b36 100644
--- a/src/main/scala/leon/utils/TypingPhase.scala
+++ b/src/main/scala/leon/utils/TypingPhase.scala
@@ -35,6 +35,7 @@ object TypingPhase extends LeonPhase[Program, Program] {
       fd.precondition = {
         val argTypesPreconditions = fd.params.flatMap(arg => arg.tpe match {
           case cct : CaseClassType if cct.parent.isDefined => Seq(CaseClassInstanceOf(cct, arg.id.toVariable))
+          case (at : ArrayType) => Seq(GreaterEquals(ArrayLength(arg.id.toVariable), IntLiteral(0)))
           case _ => Seq()
         })
         argTypesPreconditions match {
diff --git a/src/test/resources/regression/verification/purescala/invalid/Array3.scala b/src/test/resources/regression/verification/purescala/invalid/Array3.scala
index 3145fb07f..b7be061e3 100644
--- a/src/test/resources/regression/verification/purescala/invalid/Array3.scala
+++ b/src/test/resources/regression/verification/purescala/invalid/Array3.scala
@@ -5,6 +5,7 @@ import leon.lang._
 object Test {
 
   def find(c: Array[Int], i: Int): Int = {
+    require(i >= 0)
     if(c(i) == i)
       42
     else
-- 
GitLab