From f15d214df2b52dd8436cb02c0f0cf4763d85a13c Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <colder@php.net>
Date: Wed, 5 Mar 2014 12:24:18 +0100
Subject: [PATCH] Handle Choose and LetTuple correctly in instantiateType

---
 src/main/scala/leon/purescala/TypeTreeOps.scala | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/src/main/scala/leon/purescala/TypeTreeOps.scala b/src/main/scala/leon/purescala/TypeTreeOps.scala
index cb0dd2044..2c22a6e97 100644
--- a/src/main/scala/leon/purescala/TypeTreeOps.scala
+++ b/src/main/scala/leon/purescala/TypeTreeOps.scala
@@ -117,7 +117,11 @@ object TypeTreeOps {
 
       def rec(idsMap: Map[Identifier, Identifier])(e: Expr): Expr = {
         def freshId(id: Identifier, newTpe: TypeTree) = {
-          FreshIdentifier(id.name, true).setType(newTpe).copiedFrom(id)
+          if (id.getType != newTpe) {
+            FreshIdentifier(id.name, true).setType(newTpe).copiedFrom(id)
+          } else {
+            id
+          }
         }
 
         // Simple rec without affecting map
@@ -140,6 +144,14 @@ object TypeTreeOps {
             val newId = freshId(id, tpeSub(id.getType))
             Let(newId, srec(value), rec(idsMap + (id -> newId))(body)).copiedFrom(l)
 
+          case l @ LetTuple(ids, value, body) =>
+            val newIds = ids.map(id => freshId(id, tpeSub(id.getType)))
+            LetTuple(newIds, srec(value), rec(idsMap ++ (ids zip newIds))(body)).copiedFrom(l)
+
+          case c @ Choose(xs, pred) =>
+            val newXs = xs.map(id => freshId(id, tpeSub(id.getType)))
+            Choose(newXs, rec(idsMap ++ (xs zip newXs))(pred)).copiedFrom(c)
+
           case m @ MatchExpr(e, cases) =>
             val newTpe = tpeSub(e.getType)
 
-- 
GitLab