From 5f0ee7d5b02695cb077b46e1ad5d694571eb77f5 Mon Sep 17 00:00:00 2001 From: "Emmanouil (Manos) Koukoutos" <emmanouil.koukoutos@epfl.ch> Date: Thu, 22 Jan 2015 11:13:09 +0100 Subject: [PATCH] Make sure Generic values get updated according to expected type in some cases --- src/main/scala/leon/codegen/CompilationUnit.scala | 5 +++-- src/main/scala/leon/purescala/TypeTreeOps.scala | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/scala/leon/codegen/CompilationUnit.scala b/src/main/scala/leon/codegen/CompilationUnit.scala index a1fc0c4fe..20e41e421 100644 --- a/src/main/scala/leon/codegen/CompilationUnit.scala +++ b/src/main/scala/leon/codegen/CompilationUnit.scala @@ -213,8 +213,9 @@ class CompilationUnit(val ctx: LeonContext, } Tuple(elems) - case (gv : GenericValue, _: TypeParameter) => - gv + case (gv @ GenericValue(gtp, id), tp: TypeParameter) => + if (gtp == tp) gv + else GenericValue(tp, id).copiedFrom(gv) case (set : runtime.Set, SetType(b)) => FiniteSet(set.getElements().asScala.map(jvmToExpr(_, b)).toSet).setType(SetType(b)) diff --git a/src/main/scala/leon/purescala/TypeTreeOps.scala b/src/main/scala/leon/purescala/TypeTreeOps.scala index 9a1c0559f..d7533097e 100644 --- a/src/main/scala/leon/purescala/TypeTreeOps.scala +++ b/src/main/scala/leon/purescala/TypeTreeOps.scala @@ -302,6 +302,14 @@ object TypeTreeOps { case Error(tpe, desc) => Error(tpeSub(tpe), desc).copiedFrom(e) + case g @ GenericValue(tpar, id) => + tpeSub(tpar) match { + case newTpar : TypeParameter => + GenericValue(newTpar, id).copiedFrom(g) + case other => // FIXME any better ideas? + sys.error(s"Tried to substitute $tpar with $other within GenericValue $g") + } + case ens @ Ensuring(body, id, pred) => val newId = freshId(id, tpeSub(id.getType)) Ensuring(srec(body), newId, rec(idsMap + (id -> newId))(pred)).copiedFrom(ens) -- GitLab