diff --git a/src/main/scala/leon/purescala/TypeTreeOps.scala b/src/main/scala/leon/purescala/TypeTreeOps.scala index cb0dd204491a3580827083b6cf3ab24f39adeee0..2c22a6e97faa69d821267f9265c4760b4f994f84 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)