diff --git a/library/collection/package.scala b/library/collection/package.scala index 77d953a10a7f7c4b6562e7b7203fa90ba13ccebc..e163eaf4a70c525be71644ec0e05afeb4f63d87a 100644 --- a/library/collection/package.scala +++ b/library/collection/package.scala @@ -4,6 +4,7 @@ package leon import leon.annotation._ import leon.collection.List +import leon.lang._ import leon.lang.synthesis.choose package object collection { diff --git a/library/lang/Set.scala b/library/lang/Set.scala new file mode 100644 index 0000000000000000000000000000000000000000..dcedd1e0b06c865f8f49edab5b13d5f347181844 --- /dev/null +++ b/library/lang/Set.scala @@ -0,0 +1,18 @@ +package leon.lang +import leon.annotation._ + +object Set { + def empty[T] = Set[T]() +} + +@ignore +case class Set[T](elems: T*) { + def +(a: T): Set[T] = ??? + def ++(a: Set[T]): Set[T] = ??? + def -(a: T): Set[T] = ??? + def --(a: Set[T]): Set[T] = ??? + def contains(a: T): Boolean = ??? + def isEmpty: Boolean = ??? + def subsetOf(b: Set[T]): Boolean = ??? + def &(a: Set[T]): Set[T] = ??? +} diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala index eac0ef94fc699d6f999250dc3d7e072fc05abe13..6fab7051bea118c4967f0cce66697d8aa7ef230d 100644 --- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala +++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala @@ -26,7 +26,8 @@ trait ASTExtractors { protected lazy val tuple4Sym = classFromName("scala.Tuple4") protected lazy val tuple5Sym = classFromName("scala.Tuple5") protected lazy val mapSym = classFromName("scala.collection.immutable.Map") - protected lazy val setSym = classFromName("scala.collection.immutable.Set") + protected lazy val scalaSetSym = classFromName("scala.collection.immutable.Set") + protected lazy val setSym = classFromName("leon.lang.Set") protected lazy val optionClassSym = classFromName("scala.Option") protected lazy val arraySym = classFromName("scala.Array") protected lazy val someClassSym = classFromName("scala.Some") @@ -56,15 +57,19 @@ trait ASTExtractors { } } - def isSetTraitSym(sym : Symbol) : Boolean = { + def isSetSym(sym: Symbol) : Boolean = { getResolvedTypeSym(sym) == setSym } - def isMapTraitSym(sym : Symbol) : Boolean = { + def isScalaSetSym(sym: Symbol) : Boolean = { + getResolvedTypeSym(sym) == scalaSetSym + } + + def isMapTraitSym(sym: Symbol) : Boolean = { getResolvedTypeSym(sym) == mapSym } - def isMultisetTraitSym(sym : Symbol) : Boolean = { + def isMultisetTraitSym(sym: Symbol) : Boolean = { sym == multisetTraitSym } @@ -323,8 +328,9 @@ trait ASTExtractors { } object ExCaseClassSyntheticJunk { - def unapply(cd: ClassDef): Boolean = cd match { + def unapply(cd: Tree): Boolean = cd match { case ClassDef(_, _, _, _) if cd.symbol.isSynthetic => true + case DefDef(_, _, _, _, _, _) if cd.symbol.isSynthetic && (cd.symbol.isCase || cd.symbol.isPrivate) => true case _ => false } } @@ -815,23 +821,6 @@ trait ASTExtractors { } } - object ExEmptySet { - def unapply(tree: TypeApply): Option[Tree] = tree match { - case TypeApply( - Select( - Select( - Select( - Select(Ident(s), collectionName), - immutableName), - setName), - emptyName), theTypeTree :: Nil) if ( - collectionName.toString == "collection" && immutableName.toString == "immutable" && setName.toString == "Set" && emptyName.toString == "empty" - ) => Some(theTypeTree) - case TypeApply(Select(Select(Select(This(scalaName), predefName), setname), applyName), theTypeTree :: Nil) if ("scala".equals(scalaName.toString) && "Predef".equals(predefName.toString) && "empty".equals(applyName.toString)) => Some(theTypeTree) - case _ => None - } - } - object ExEmptyMultiset { def unapply(tree: TypeApply): Option[Tree] = tree match { case TypeApply( @@ -867,14 +856,6 @@ trait ASTExtractors { } } - object ExFiniteSet { - def unapply(tree: Apply): Option[(Tree,List[Tree])] = tree match { - case Apply(TypeApply(Select(Select(Select(Select(Ident(s), collectionName), immutableName), setName), applyName), theTypeTree :: Nil), args) if (collectionName.toString == "collection" && immutableName.toString == "immutable" && setName.toString == "Set" && applyName.toString == "apply") => Some((theTypeTree, args)) - case Apply(TypeApply(Select(Select(Select(This(scalaName), predefName), setName), applyName), theTypeTree :: Nil), args) if ("scala".equals(scalaName.toString) && "Predef".equals(predefName.toString) && setName.toString == "Set" && "apply".equals(applyName.toString)) => Some((theTypeTree, args)) - case _ => None - } - } - object ExFiniteMultiset { def unapply(tree: Apply): Option[(Tree,List[Tree])] = tree match { case Apply( diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala index b4f2a020067473d80cc24274146bcf87d6b6549a..70a0eacf23b1a2d4d3e17e254422a69fcbff1d41 100644 --- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala +++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala @@ -869,6 +869,7 @@ trait CodeExtraction extends ASTExtractors { case ExFieldAccessorFunction() => case d if isIgnored(d.symbol) || (d.symbol.isImplicit && d.symbol.isSynthetic) => case tree => + println(tree) outOfSubsetError(tree, "Don't know what to do with this. Not purescala?"); } @@ -1410,8 +1411,10 @@ trait CodeExtraction extends ASTExtractors { case ExCaseClassConstruction(tpt, args) => extractType(tpt) match { case cct: CaseClassType => - val nargs = args.map(extractTree) - CaseClass(cct, nargs) + CaseClass(cct, args.map(extractTree)) + + case SetType(underlying) => + finiteSet(args.map(extractTree).toSet, underlying) case _ => outOfSubsetError(tr, "Construction of a non-case class.") @@ -1460,13 +1463,6 @@ trait CodeExtraction extends ASTExtractors { outOfSubsetError(tr, "Invalid comparison: (_: "+rt+") == (_: "+lt+")") } - case ExFiniteSet(tt, args) => - val underlying = extractType(tt) - finiteSet(args.map(extractTree).toSet, underlying) - case ExEmptySet(tt) => - val underlying = extractType(tt) - EmptySet(underlying) - case ExFiniteMultiset(tt, args) => val underlying = extractType(tt) finiteMultiset(args.map(extractTree),underlying) @@ -1689,11 +1685,11 @@ trait CodeExtraction extends ASTExtractors { or(a1, a2) // Set methods - case (IsTyped(a1, SetType(b1)), "min", Nil) => - SetMin(a1) + //case (IsTyped(a1, SetType(b1)), "min", Nil) => + // SetMin(a1) - case (IsTyped(a1, SetType(b1)), "max", Nil) => - SetMax(a1) + //case (IsTyped(a1, SetType(b1)), "max", Nil) => + // SetMax(a1) case (IsTyped(a1, SetType(b1)), "++", List(IsTyped(a2, SetType(b2)))) if b1 == b2 => SetUnion(a1, a2) @@ -1710,6 +1706,9 @@ trait CodeExtraction extends ASTExtractors { case (IsTyped(a1, SetType(b1)), "contains", List(a2)) => ElementOfSet(a2, a1) + case (IsTyped(a1, SetType(b1)), "isEmpty", List()) => + Equals(a1, finiteSet(Set(), b1)) + // Multiset methods case (IsTyped(a1, MultisetType(b1)), "++", List(IsTyped(a2, MultisetType(b2)))) if b1 == b2 => MultisetUnion(a1, a2) @@ -1795,7 +1794,10 @@ trait CodeExtraction extends ASTExtractors { case TypeRef(_, sym, _) if isBigIntSym(sym) => IntegerType - case TypeRef(_, sym, btt :: Nil) if isSetTraitSym(sym) => + case TypeRef(_, sym, btt :: Nil) if isScalaSetSym(sym) => + outOfSubsetError(pos, "Scala's Set API is no longer extracted. Make sure you import leon.lang.Set that defines supported Set operations.") + + case TypeRef(_, sym, btt :: Nil) if isSetSym(sym) => SetType(extractType(btt)) case TypeRef(_, sym, btt :: Nil) if isMultisetTraitSym(sym) => diff --git a/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala b/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala index 005138c93e2fcff2a5b3994828c30601c0be52a6..a08f55c6c272fabecad5969db11850b85c7f3138 100644 --- a/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala +++ b/src/main/scala/leon/frontends/scalac/ExtractionPhase.scala @@ -36,10 +36,11 @@ object ExtractionPhase extends LeonPhase[List[String], Program] { "make sure to set the ECLIPSE_HOME environment variable to your Eclipse installation home directory" )) - settings.classpath.value = scalaLib - settings.usejavacp.value = false - settings.Yrangepos.value = true - settings.skip.value = List("patmat") + settings.classpath.value = scalaLib + settings.usejavacp.value = false + settings.deprecation.value = true + settings.Yrangepos.value = true + settings.skip.value = List("patmat") val compilerOpts = Build.libFiles ::: args.filterNot(_.startsWith("--")) diff --git a/src/main/scala/leon/frontends/scalac/SimpleReporter.scala b/src/main/scala/leon/frontends/scalac/SimpleReporter.scala index 60be71545731d2db588250e49a6536e0314946a6..d04cebb3e04eaa78a555c33f1093c1a1e6935849 100644 --- a/src/main/scala/leon/frontends/scalac/SimpleReporter.scala +++ b/src/main/scala/leon/frontends/scalac/SimpleReporter.scala @@ -53,28 +53,14 @@ class SimpleReporter(val settings: Settings, reporter: leon.Reporter) extends Ab case _ => val buf = new StringBuilder(msg) val lpos = LeonOffsetPosition(pos.line, pos.column, pos.point, pos.source.file.file) - printMessage(msg+"\n"+getSourceLine(pos), lpos, severity) + printMessage(msg, lpos, severity) } } + def print(pos: Position, msg: String, severity: Severity) { printMessage(pos, clabel(severity) + msg, severity) } - def getSourceLine(pos: Position) = { - pos.lineContent.stripLineEnd+getColumnMarker(pos) - } - - def getColumnMarker(pos: Position) = if (pos.isDefined) { - "\n"+(" " * (pos.column - 1) + "^") - } else { - "" - } - - def printSummary() { - if (WARNING.count > 0) printMessage(getCountString(WARNING) + " found", LeonNoPosition, INFO) - if ( ERROR.count > 0) printMessage(getCountString(ERROR ) + " found", LeonNoPosition, INFO) - } - def display(pos: Position, msg: String, severity: Severity) { severity.count += 1 if (severity != ERROR || severity.count <= ERROR_LIMIT) diff --git a/src/test/resources/regression/repair/Heap4.scala b/src/test/resources/regression/repair/Heap4.scala index cd06242701790e72236f57604db4ec8c83919b97..75f03aab55f773210738e0455d8e0468a33b03cb 100644 --- a/src/test/resources/regression/repair/Heap4.scala +++ b/src/test/resources/regression/repair/Heap4.scala @@ -4,8 +4,9 @@ * Date: 20.11.2013 **/ +import leon._ +import leon.lang._ import leon.collection._ -import leon._ object HeapSort { diff --git a/src/test/resources/regression/repair/MergeSort2.scala b/src/test/resources/regression/repair/MergeSort2.scala index 2cb780bb058d36a4b4b2627d682b56504ba8e024..ca22569d80c779b3fce3575b66ae0fd701661062 100644 --- a/src/test/resources/regression/repair/MergeSort2.scala +++ b/src/test/resources/regression/repair/MergeSort2.scala @@ -1,5 +1,6 @@ /* Copyright 2009-2015 EPFL, Lausanne */ +import leon.lang._ import leon.collection._ object MergeSort { diff --git a/src/test/resources/regression/termination/valid/BinaryTreeImp.scala b/src/test/resources/regression/termination/valid/BinaryTreeImp.scala index 5c2f48c3d444fec728c3c4817957518b2fe60c7c..c758798bf753fc5ac5f1f1a9c65927e509166b8c 100644 --- a/src/test/resources/regression/termination/valid/BinaryTreeImp.scala +++ b/src/test/resources/regression/termination/valid/BinaryTreeImp.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/termination/valid/ListWithSize.scala b/src/test/resources/regression/termination/valid/ListWithSize.scala index 00bd968ad51692c9617098d3315b94d85c5456a9..af8aafeb8d5f669f8daf7fbc9b8c3abc69fd6f3e 100644 --- a/src/test/resources/regression/termination/valid/ListWithSize.scala +++ b/src/test/resources/regression/termination/valid/ListWithSize.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/termination/valid/QuickSort.scala b/src/test/resources/regression/termination/valid/QuickSort.scala index 5687c778f47ee1d1084441a009f4bdf67bbbcccf..e356bdc2a2b8a1c412e90a3033ae269faf6d7df0 100644 --- a/src/test/resources/regression/termination/valid/QuickSort.scala +++ b/src/test/resources/regression/termination/valid/QuickSort.scala @@ -1,6 +1,6 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set +import leon.lang._ object QuickSort { sealed abstract class List diff --git a/src/test/resources/regression/termination/valid/RedBlackTree.scala b/src/test/resources/regression/termination/valid/RedBlackTree.scala index 76c4e03a99774859ccb4238c8d91093fc1cf256d..2d48a25e0dee87ac6f94563e3b28cb48ca8eb567 100644 --- a/src/test/resources/regression/termination/valid/RedBlackTree.scala +++ b/src/test/resources/regression/termination/valid/RedBlackTree.scala @@ -1,7 +1,6 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set -//import scala.collection.immutable.Multiset +import leon.lang._ object RedBlackTree { sealed abstract class Color diff --git a/src/test/resources/regression/termination/valid/SimpInterpret.scala b/src/test/resources/regression/termination/valid/SimpInterpret.scala index 22c31f1944198e0d5795dfbde575fc660492e4e4..76fcd4145509440741b521bf26fa97dcc9af2dd9 100644 --- a/src/test/resources/regression/termination/valid/SimpInterpret.scala +++ b/src/test/resources/regression/termination/valid/SimpInterpret.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -//import scala.collection.immutable.Set //import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala b/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala index 1f74ed4b12933352dedeb22dadff0f1d1121f19d..0b55b9a5164bbd86e8be0bc4a61e8f5f29867d88 100644 --- a/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala +++ b/src/test/resources/regression/verification/newsolvers/valid/AmortizedQueue.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2014 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala b/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala index a62a765f5eb3700b90be8fea45df8812413f1b43..ad22edcd88daeb11f1b1d41f35dc48e5766ad0ad 100644 --- a/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala +++ b/src/test/resources/regression/verification/newsolvers/valid/AssociativeList.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2014 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala b/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala index a3120a9bc9e728ab5a6f352d649b64e9c67e761c..81109ba330f13246061e7ef9cb1422ab72223ab9 100644 --- a/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala +++ b/src/test/resources/regression/verification/newsolvers/valid/InsertionSort.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2014 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala b/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala index 2986a4342ac0bf5f65b2bb21dad5324fdb5223b8..3965ab57d9021ef7b9823d702d83daa14728b80f 100644 --- a/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala +++ b/src/test/resources/regression/verification/newsolvers/valid/ListOperations.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2014 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala b/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala index a41dab8262f9910662a994b0d6def78bf1bac5c7..4c2beb4c78bbcbe3177249b9866d6df73fa65bb6 100644 --- a/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala +++ b/src/test/resources/regression/verification/newsolvers/valid/PropositionalLogic.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2014 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala b/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala index 841befb415c77e3609b9ad7bf28a1e760d3ce39f..edaee5e92a4d10eb089e6e9a91e3e27678d4f84a 100644 --- a/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala +++ b/src/test/resources/regression/verification/newsolvers/valid/RedBlackTree.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2014 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala b/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala index bd0596fbaab48f4a64309e71d019db53ed72db2a..87076bb973026c4eac73fe191bc80d778105b30c 100644 --- a/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala +++ b/src/test/resources/regression/verification/newsolvers/valid/SearchLinkedList.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2014 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala b/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala index 5b4d876143454ef9e35de903fd5634df0663829f..d82f045b52c4870e0d243fd77777e1e19a5b60bd 100644 --- a/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala +++ b/src/test/resources/regression/verification/purescala/invalid/InsertionSort.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala b/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala index 7c880d29975fe35814606bcd8ddfeb97319d31e7..46e90ccfc64fc33383abcfac5db86e7060821b6e 100644 --- a/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala +++ b/src/test/resources/regression/verification/purescala/invalid/ListOperations.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala b/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala index 6cf45fb74e6944c025ffcfc73992caead6bee1d4..547978dbcca900272b76aac30dfd8e2a8f9e2c62 100644 --- a/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala +++ b/src/test/resources/regression/verification/purescala/invalid/PropositionalLogic.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala b/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala index c37713f8e5f91aa9d593520d37060697aa6d58e8..f56a174de585e0e17ee64ae989af8cbee56b4371 100644 --- a/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala +++ b/src/test/resources/regression/verification/purescala/invalid/RedBlackTree.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala b/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala index 7486b49f3b3b40074fac773a36dca29eb9adb322..006fbde9ac76dd8f366fd0f495fe4f349b861eaf 100644 --- a/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala +++ b/src/test/resources/regression/verification/purescala/valid/AmortizedQueue.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala b/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala index 5fd977e8b3c8b76662e5e4aa004d91af68962242..39cc5b7326c3d1aa964055f6335336943b2afcf7 100644 --- a/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala +++ b/src/test/resources/regression/verification/purescala/valid/AssociativeList.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala b/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala index 4e0d60a94973dda4f56f8853cc076efa3c907588..7c89f364600e95edb8c0f266cb5e22f65d1adbea 100644 --- a/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala +++ b/src/test/resources/regression/verification/purescala/valid/InsertionSort.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/purescala/valid/ListOperations.scala b/src/test/resources/regression/verification/purescala/valid/ListOperations.scala index 341c3ec8592bc4e7050d1187bf8d9f2363b68f3c..72a27c049c546696d8dd3853fe0ccdd26e077082 100644 --- a/src/test/resources/regression/verification/purescala/valid/ListOperations.scala +++ b/src/test/resources/regression/verification/purescala/valid/ListOperations.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala b/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala index 2ca4e27fdc6623ef009483e69c72a099016ec3f2..66e3f84ecfa11a460c6e721f69cb44d51def285e 100644 --- a/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala +++ b/src/test/resources/regression/verification/purescala/valid/PropositionalLogic.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala b/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala index 12cfc679ee3219d1af89d306b414b506ed2415be..e24935bbedb8f87e0778f29f44f3a4758560fc11 100644 --- a/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala +++ b/src/test/resources/regression/verification/purescala/valid/RedBlackTree.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala b/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala index f66557f0da7448cc3aa5dc292dc31a24ab853d26..882dfa14001698091f09b51c67e346d1a74480b0 100644 --- a/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala +++ b/src/test/resources/regression/verification/purescala/valid/SearchLinkedList.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.lang._ import leon.annotation._ diff --git a/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala b/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala index 35bae37259c9d1b12606521846e9d5f3ca9154ac..c7e8bd533ed8e7b49301a903b79939810884a5f7 100644 --- a/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala +++ b/src/test/resources/regression/verification/purescala/valid/Subtyping1.scala @@ -1,5 +1,7 @@ /* Copyright 2009-2015 EPFL, Lausanne */ +import leon.lang._ + object Subtyping1 { sealed abstract class Tree diff --git a/src/test/resources/regression/verification/xlang/invalid/Mean.scala b/src/test/resources/regression/verification/xlang/invalid/Mean.scala index 9d1fd563c3cc8c9bf191aeeef5e1be093e78bd32..02240e73b2e04244e8a55c1881e21b0381852302 100644 --- a/src/test/resources/regression/verification/xlang/invalid/Mean.scala +++ b/src/test/resources/regression/verification/xlang/invalid/Mean.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/resources/regression/verification/xlang/valid/Mean.scala b/src/test/resources/regression/verification/xlang/valid/Mean.scala index 16e032896c0b9134cd44be59d1f23b0e2b46e0c7..155b7095a112266b76fed38b3037e9412a0fa49e 100644 --- a/src/test/resources/regression/verification/xlang/valid/Mean.scala +++ b/src/test/resources/regression/verification/xlang/valid/Mean.scala @@ -1,6 +1,5 @@ /* Copyright 2009-2015 EPFL, Lausanne */ -import scala.collection.immutable.Set import leon.annotation._ import leon.lang._ diff --git a/src/test/scala/leon/test/LeonTestSuite.scala b/src/test/scala/leon/test/LeonTestSuite.scala index 0c8f08b70a16bd9ca56c04902f716be209586329..c43e597a61aced0c3a4708d0c9189ee8c91a7ab0 100644 --- a/src/test/scala/leon/test/LeonTestSuite.scala +++ b/src/test/scala/leon/test/LeonTestSuite.scala @@ -103,7 +103,6 @@ trait LeonTestSuite extends FunSuite with Timeouts with BeforeAndAfterEach { } override def test(name: String, tags: Tag*)(body: => Unit) { - super.test(name, tags: _*) { val id = testIdentifier(name) diff --git a/src/test/scala/leon/test/codegen/CodeGenTests.scala b/src/test/scala/leon/test/codegen/CodeGenTests.scala index 9142374f72e9a3fb7cbc3eabc0fc9d48e0c8ca9f..88f1481f7504446530f5eee853ab6fe3e6bb5dce 100644 --- a/src/test/scala/leon/test/codegen/CodeGenTests.scala +++ b/src/test/scala/leon/test/codegen/CodeGenTests.scala @@ -127,7 +127,8 @@ class CodeGenTests extends test.LeonTestSuite { val code = """ - + import leon.lang._ + object simple { abstract class Abs case class Conc(x : Int) extends Abs diff --git a/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala b/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala index 87d5a2d078393bd4089054c63df2ed87d76778f2..81eee7077af71761f1b5d4121bba6ac33a759219 100644 --- a/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala +++ b/src/test/scala/leon/test/evaluators/EvaluatorsTests.scala @@ -298,7 +298,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { } test("Sets") { - val p = """|object Program { + val p = """|import leon.lang._ + |object Program { | sealed abstract class List | case class Nil() extends List | case class Cons(head : Int, tail : List) extends List @@ -343,20 +344,21 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { } test("Maps") { - val p = """|object Program { - |sealed abstract class PList - |case class PNil() extends PList - |case class PCons(headfst : Int, headsnd : Int, tail : PList) extends PList + val p = """|import leon.lang._ + |object Program { + | sealed abstract class PList + | case class PNil() extends PList + | case class PCons(headfst : Int, headsnd : Int, tail : PList) extends PList | - |def toMap(pl : PList) : Map[Int,Int] = pl match { - | case PNil() => Map.empty[Int,Int] - | case PCons(f,s,xs) => toMap(xs).updated(f, s) - |} + | def toMap(pl : PList) : Map[Int,Int] = pl match { + | case PNil() => Map.empty[Int,Int] + | case PCons(f,s,xs) => toMap(xs).updated(f, s) + | } | - |def finite0() : Map[Int,Int] = Map[Int, Int]() - |def finite1() : Map[Int,Int] = Map(1 -> 2) - |def finite2() : Map[Int,Int] = Map(2 -> 3, 1 -> 2) - |def finite3() : Map[Int,Int] = finite1().updated(2, 3) + | def finite0() : Map[Int,Int] = Map[Int, Int]() + | def finite1() : Map[Int,Int] = Map(1 -> 2) + | def finite2() : Map[Int,Int] = Map(2 -> 3, 1 -> 2) + | def finite3() : Map[Int,Int] = finite1().updated(2, 3) |}""".stripMargin implicit val prog = parseString(p) @@ -377,7 +379,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { } test("Arrays") { - val p = """|object Program { + val p = """|import leon.lang._ + |object Program { | def boolArrayRead(bools : Array[Boolean], index : Int) : Boolean = bools(index) | | def intArrayRead(ints : Array[Int], index : Int) : Int = ints(index) @@ -410,7 +413,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { } test("Sets and maps of structures") { - val p = """|object Program { + val p = """|import leon.lang._ + |object Program { | case class MyPair(x : Int, y : Boolean) | | def buildPairCC(x : Int, y : Boolean) : MyPair = MyPair(x,y) @@ -432,7 +436,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { } test("Executing Chooses") { - val p = """|object Program { + val p = """|import leon.lang._ + |object Program { | import leon.lang._ | import leon.lang.synthesis._ | @@ -451,7 +456,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { test("Infinite Recursion") { import leon.codegen._ - val p = """|object Program { + val p = """|import leon.lang._ + |object Program { | import leon.lang._ | | def c(i : Int) : Int = c(i-1) @@ -467,7 +473,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { test("Wrong Contracts") { import leon.codegen._ - val p = """|object Program { + val p = """|import leon.lang._ + |object Program { | import leon.lang._ | | def c(i : Int) : Int = { @@ -484,7 +491,8 @@ class EvaluatorsTests extends leon.test.LeonTestSuite { } test("Pattern Matching") { - val p = """|object Program { + val p = """|import leon.lang._ + |object Program { | abstract class List; | case class Cons(h: Int, t: List) extends List; | case object Nil extends List; diff --git a/src/test/scala/leon/test/verification/NewSolversRegression.scala b/src/test/scala/leon/test/verification/NewSolversRegression.scala index 2a287efd2bf956ca1a36f518a2b41001d7f2e4dc..558621bb2e15e1504f83d48c389423e24c24ee25 100644 --- a/src/test/scala/leon/test/verification/NewSolversRegression.scala +++ b/src/test/scala/leon/test/verification/NewSolversRegression.scala @@ -42,7 +42,4 @@ class NewSolversRegression extends VerificationRegression { else Nil ) } - - test() - } diff --git a/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala b/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala index bf9256a416bb55052edfccb9b521c1b0c008263e..0221488a5886cd885e84ae175fef6dea9c76fb3d 100644 --- a/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala +++ b/src/test/scala/leon/test/verification/PureScalaVerificationRegression.scala @@ -46,6 +46,4 @@ class PureScalaVerificationRegression extends VerificationRegression { ) } - test() - } diff --git a/src/test/scala/leon/test/verification/VerificationRegression.scala b/src/test/scala/leon/test/verification/VerificationRegression.scala index 0f46c569ba4feec4f126cca3d251056aa473f3db..a03cfcd9704addfa859ac103d91a21cfa7542fe7 100644 --- a/src/test/scala/leon/test/verification/VerificationRegression.scala +++ b/src/test/scala/leon/test/verification/VerificationRegression.scala @@ -10,6 +10,7 @@ import leon.purescala.Definitions.Program import leon.frontends.scalac.ExtractionPhase import leon.utils.PreprocessingPhase +import org.scalatest.{Reporter => TestReporter, _} // If you add another regression test, make sure it contains one object whose name matches the file name // This is because we compile all tests from each folder separately. @@ -29,22 +30,36 @@ trait VerificationRegression extends LeonTestSuite { val pipeBack : Pipeline[Program, VerificationReport] private def mkTest(files: List[String])(block: Output=>Unit) = { - val extraction = + val extraction = ExtractionPhase andThen PreprocessingPhase andThen pipeFront - val ast = extraction.run(createLeonContext(files:_*))(files) - val programs = { - val (user, lib) = ast.units partition { _.isMainUnit } - user map { u => Program(u.id.freshen, u :: lib) } - } - for (p <- programs; options <- optionVariants) { - test(f"${nextInt()}%3d: ${p.id.name} ${options.mkString(" ")}") { - val ctx = createLeonContext(options: _*) - val report = pipeBack.run(ctx)(p) - block(Output(report, ctx.reporter)) + val ctx = createLeonContext(files:_*) + + try { + val ast = extraction.run(ctx)(files) + val programs = { + val (user, lib) = ast.units partition { _.isMainUnit } + user map { u => Program(u.id.freshen, u :: lib) } + } + for (p <- programs; options <- optionVariants) { + test(f"${nextInt()}%3d: ${p.id.name} ${options.mkString(" ")}") { + val ctx = createLeonContext(options: _*) + val report = pipeBack.run(ctx)(p) + block(Output(report, ctx.reporter)) + } } + } catch { + case _: LeonFatalError => + ctx.reporter match { + case sr: TestSilentReporter => + println("Unnexpected Fatal error:") + for (e <- sr.lastErrors) { + println(" "+e) + } + case _ => + } } } @@ -61,7 +76,7 @@ trait VerificationRegression extends LeonTestSuite { mkTest(files)(block) } - def test() = { + override def run(testName: Option[String], args: Args): Status = { forEachFileIn("valid") { output => val Output(report, reporter) = output for ((vc, vr) <- report.vrs) { @@ -79,5 +94,7 @@ trait VerificationRegression extends LeonTestSuite { assert(report.totalUnknown === 0, "There should not be unknown verification conditions.") } + + super.run(testName, args) } }