From c2179e1354a2f4f1ede0f905d2fb3e2ccba0c056 Mon Sep 17 00:00:00 2001 From: Regis Blanc <regwblanc@gmail.com> Date: Fri, 20 Feb 2015 15:51:35 +0100 Subject: [PATCH] cleaner BigInt extractor front-end --- .../scala/leon/frontends/scalac/ASTExtractors.scala | 6 +++--- .../scala/leon/frontends/scalac/CodeExtraction.scala | 7 ++++--- src/main/scala/leon/purescala/Trees.scala | 4 ---- .../verification/purescala/error/ConvertBigInt.scala | 7 +++++++ .../verification/purescala/error/LiteralBigInt.scala | 7 +++++++ .../verification/purescala/valid/FoolProofAdder.scala | 11 +++++++++++ 6 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/regression/verification/purescala/error/ConvertBigInt.scala create mode 100644 src/test/resources/regression/verification/purescala/error/LiteralBigInt.scala create mode 100644 src/test/resources/regression/verification/purescala/valid/FoolProofAdder.scala diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala index dfd099bcc..edd9e7dc8 100644 --- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala +++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala @@ -220,9 +220,9 @@ trait ASTExtractors { } object ExBigIntLiteral { - def unapply(tree: Tree): Option[Int] = tree match { - case Apply(ExSelected("scala", "package", "BigInt", "apply"), (n: Literal) :: Nil) => - Some(n.value.intValue) + def unapply(tree: Tree): Option[Tree] = tree match { + case Apply(ExSelected("scala", "package", "BigInt", "apply"), n :: Nil) => + Some(n) case _ => None } diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala index 7acbe7175..13aefc5b7 100644 --- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala +++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala @@ -1204,9 +1204,10 @@ trait CodeExtraction extends ASTExtractors { val newValueRec = extractTree(newValue) ArrayUpdate(lhsRec, indexRec, newValueRec) - case ExBigIntLiteral(n) => { - InfiniteIntegerLiteral(BigInt(n)) + case ExBigIntLiteral(n: Literal) => { + InfiniteIntegerLiteral(BigInt(n.value.stringValue)) } + case ExBigIntLiteral(n) => outOfSubsetError(tr, "Non-literal BigInt constructor") case ExIntToBigInt(tree) => { val rec = extractTree(tree) @@ -1214,7 +1215,7 @@ trait CodeExtraction extends ASTExtractors { case IntLiteral(n) => InfiniteIntegerLiteral(BigInt(n)) case _ => - IntToBigInt(rec) + outOfSubsetError(tr, "Conversion from Int to BigInt") } } diff --git a/src/main/scala/leon/purescala/Trees.scala b/src/main/scala/leon/purescala/Trees.scala index 60b6eb3fb..278d66f66 100644 --- a/src/main/scala/leon/purescala/Trees.scala +++ b/src/main/scala/leon/purescala/Trees.scala @@ -394,10 +394,6 @@ object Trees { val getType = Int32Type } - case class IntToBigInt(expr: Expr) extends Expr { - val getType = Int32Type - } - /* Set expressions */ case class FiniteSet(elements: Set[Expr]) extends Expr with MutableTyped { val tpe = if (elements.isEmpty) None else leastUpperBound(elements.toSeq.map(_.getType)) diff --git a/src/test/resources/regression/verification/purescala/error/ConvertBigInt.scala b/src/test/resources/regression/verification/purescala/error/ConvertBigInt.scala new file mode 100644 index 000000000..41e209a10 --- /dev/null +++ b/src/test/resources/regression/verification/purescala/error/ConvertBigInt.scala @@ -0,0 +1,7 @@ +/* Copyright 2009-2014 EPFL, Lausanne */ + +object ConvertBigInt { + + def safeInt(x: Int): BigInt = x + +} diff --git a/src/test/resources/regression/verification/purescala/error/LiteralBigInt.scala b/src/test/resources/regression/verification/purescala/error/LiteralBigInt.scala new file mode 100644 index 000000000..67783edc8 --- /dev/null +++ b/src/test/resources/regression/verification/purescala/error/LiteralBigInt.scala @@ -0,0 +1,7 @@ +/* Copyright 2009-2014 EPFL, Lausanne */ + +object LiteralBigInt { + + def safeInt(x: Int): BigInt = BigInt(x) + +} diff --git a/src/test/resources/regression/verification/purescala/valid/FoolProofAdder.scala b/src/test/resources/regression/verification/purescala/valid/FoolProofAdder.scala new file mode 100644 index 000000000..4fd46f85f --- /dev/null +++ b/src/test/resources/regression/verification/purescala/valid/FoolProofAdder.scala @@ -0,0 +1,11 @@ +import leon.annotation._ +import leon.lang._ + +object FoolProofAdder { + + def foolProofAdder(x: BigInt): BigInt = { + require(x > 0) + x + BigInt(999999) + BigInt("999999999999999") + } ensuring(_ > 0) + +} -- GitLab