From e95b7dc47e15a30f54fe92698d51e319769133a2 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Tue, 30 Oct 2012 16:51:21 +0100
Subject: [PATCH] Extract leon.Utils.error[T] calls correctly

---
 src/main/scala/leon/plugin/CodeExtraction.scala | 4 ++--
 src/main/scala/leon/plugin/Extractors.scala     | 6 +++---
 testcases/Errors.scala                          | 6 ++++++
 3 files changed, 11 insertions(+), 5 deletions(-)
 create mode 100644 testcases/Errors.scala

diff --git a/src/main/scala/leon/plugin/CodeExtraction.scala b/src/main/scala/leon/plugin/CodeExtraction.scala
index 5ada9b223..67071a6d0 100644
--- a/src/main/scala/leon/plugin/CodeExtraction.scala
+++ b/src/main/scala/leon/plugin/CodeExtraction.scala
@@ -534,8 +534,8 @@ trait CodeExtraction extends Extractors {
             val tupleType = TupleType(tupleExprs.map(expr => bestRealType(expr.getType)))
             Tuple(tupleExprs).setType(tupleType)
           }
-          case ExErrorExpression(str) =>
-            Error(str).setType(scalaType2PureScala(unit, silent)(nextExpr.tpe))
+          case ExErrorExpression(str, tpe) =>
+            Error(str).setType(scalaType2PureScala(unit, silent)(tpe))
 
           case ExTupleExtract(tuple, index) => {
             val tupleExpr = rec(tuple)
diff --git a/src/main/scala/leon/plugin/Extractors.scala b/src/main/scala/leon/plugin/Extractors.scala
index e736f7536..8b3eebd4b 100644
--- a/src/main/scala/leon/plugin/Extractors.scala
+++ b/src/main/scala/leon/plugin/Extractors.scala
@@ -183,9 +183,9 @@ trait Extractors {
     }
 
     object ExErrorExpression {
-      def unapply(tree: Apply) : Option[String] = tree match {
-        case a @ Apply(Select(Select(Select(ExIdNamed("scala"), ExNamed("sys")), ExNamed("package")), ExNamed("error")), List(lit : Literal)) =>
-          Some(lit.value.stringValue)
+      def unapply(tree: Apply) : Option[(String, Type)] = tree match {
+        case a @ Apply(TypeApply(Select(Select(ExIdNamed("leon"), ExNamed("Utils")), ExNamed("error")), List(tpe)), List(lit : Literal)) =>
+          Some((lit.value.stringValue, tpe.tpe))
         case _ =>
           None
       }
diff --git a/testcases/Errors.scala b/testcases/Errors.scala
new file mode 100644
index 000000000..b6d7dc74e
--- /dev/null
+++ b/testcases/Errors.scala
@@ -0,0 +1,6 @@
+import leon.Utils._
+
+object Errors {
+  def a(a: Int): Int = error[Int]("This is an error")
+}
+
-- 
GitLab