From d27932a5225c9176c0d0fab2f9e2312b64dcd1c7 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Fri, 21 Aug 2015 11:46:58 +0200
Subject: [PATCH] Bring back match exhaustiveness checks

---
 .../leon/verification/DefaultTactic.scala     |  8 ++---
 .../purescala/invalid/MatchExh.scala          | 35 +++++++++++++++++++
 .../purescala/valid/MatchExh.scala            | 18 ++++++++++
 3 files changed, 57 insertions(+), 4 deletions(-)
 create mode 100644 src/regression/resources/regression/verification/purescala/invalid/MatchExh.scala
 create mode 100644 src/regression/resources/regression/verification/purescala/valid/MatchExh.scala

diff --git a/src/main/scala/leon/verification/DefaultTactic.scala b/src/main/scala/leon/verification/DefaultTactic.scala
index 2bcd2eb0b..bba6f4fa2 100644
--- a/src/main/scala/leon/verification/DefaultTactic.scala
+++ b/src/main/scala/leon/verification/DefaultTactic.scala
@@ -46,9 +46,9 @@ class DefaultTactic(vctx: VerificationContext) extends Tactic(vctx) {
       fd.body match {
         case Some(body) =>
           val calls = collectWithPC {
-            case e @ Error(_, "Match is non-exhaustive") =>
-              (e, VCKinds.ExhaustiveMatch, BooleanLiteral(false))
 
+            case m @ MatchExpr(scrut, cases) =>
+              (m, VCKinds.ExhaustiveMatch, orJoin(cases map (matchCaseCondition(scrut, _))))
 
             case e @ Error(_, _) =>
               (e, VCKinds.Assert, BooleanLiteral(false))
@@ -77,8 +77,8 @@ class DefaultTactic(vctx: VerificationContext) extends Tactic(vctx) {
           }(body)
 
           calls.map {
-            case ((e, kind, errorCond), path) =>
-              val vc = implies(and(precOrTrue(fd), path), errorCond)
+            case ((e, kind, correctnessCond), path) =>
+              val vc = implies(and(precOrTrue(fd), path), correctnessCond)
 
               VC(vc, fd, kind, this).setPos(e)
           }
diff --git a/src/regression/resources/regression/verification/purescala/invalid/MatchExh.scala b/src/regression/resources/regression/verification/purescala/invalid/MatchExh.scala
new file mode 100644
index 000000000..0f7f7d736
--- /dev/null
+++ b/src/regression/resources/regression/verification/purescala/invalid/MatchExh.scala
@@ -0,0 +1,35 @@
+import leon.lang._
+import leon.collection._
+
+object MatchExh {
+  
+  def exh1(i: Int) = i match {
+    case 1 => 2
+    case 0 => 2
+    case _ => 2
+  }
+
+  def exh2[A](l: List[A]) = l match {
+    case Nil() => 0
+    case Cons(a, Nil()) => 1
+    case Cons(a, _) => 2
+  }
+
+  def err1(i: Int) = i match {
+    case 1 => 2
+    case 0 => 42
+  }
+
+  def err2[A](l: List[A]) = l match {
+    case Nil() => 0
+    case Cons(a, Nil()) => 1
+    case Cons(a, Cons(b, _)) if a == b => 2
+  }
+
+  def err3(l: List[BigInt]) = l match {
+    case Nil() => 0
+    case Cons(BigInt(0), Nil()) => 0
+    case Cons(_, Cons(_, _)) => 1
+  }
+
+}
diff --git a/src/regression/resources/regression/verification/purescala/valid/MatchExh.scala b/src/regression/resources/regression/verification/purescala/valid/MatchExh.scala
new file mode 100644
index 000000000..77251bc8c
--- /dev/null
+++ b/src/regression/resources/regression/verification/purescala/valid/MatchExh.scala
@@ -0,0 +1,18 @@
+import leon.lang._
+import leon.collection._
+
+object MatchExh {
+  
+  def exh1(i: Int) = i match {
+    case 1 => 2
+    case 0 => 2
+    case _ => 2
+  }
+
+  def exh2[A](l: List[A]) = l match {
+    case Nil() => 0
+    case Cons(a, Nil()) => 1
+    case Cons(a, _) => 2
+  }
+
+}
-- 
GitLab