diff --git a/src/main/scala/leon/plugin/CodeExtraction.scala b/src/main/scala/leon/plugin/CodeExtraction.scala index 2825b47a6dfeb5a8cfd125a05f8e1eed26c7fbdf..2b3187e1ae116fe01c79f2d408d1682287549dca 100644 --- a/src/main/scala/leon/plugin/CodeExtraction.scala +++ b/src/main/scala/leon/plugin/CodeExtraction.scala @@ -339,6 +339,10 @@ trait CodeExtraction extends Extractors { } } + + private var currentFunDef: FunDef = null + private var owners: Map[Expr, Option[FunDef]] = Map() + /** Forces conversion from scalac AST to purescala AST, throws an Exception * if impossible. If not in 'silent mode', non-pure AST nodes are reported as * errors. */ @@ -415,6 +419,8 @@ trait CodeExtraction extends Extractors { var reqCont: Option[Expr] = None var ensCont: Option[Expr] = None + currentFunDef = funDef + realBody match { case ExEnsuredExpression(body2, resSym, contract) => { varSubsts(resSym) = (() => ResultVariable().setType(funDef.returnType)) @@ -444,12 +450,18 @@ trait CodeExtraction extends Extractors { case e: ImpureCodeEncounteredException => None } - reqCont.map(e => + bodyAttempt.foreach(e => + if(e.getType.isInstanceOf[ArrayType] && owners.get(e).getOrElse(null) != funDef) { + unit.error(realBody.pos, "Function cannot return an array that is not locally defined") + throw ImpureCodeEncounteredException(realBody) + }) + + reqCont.foreach(e => if(containsLetDef(e)) { unit.error(realBody.pos, "Function precondtion should not contain nested function definition") throw ImpureCodeEncounteredException(realBody) }) - ensCont.map(e => + ensCont.foreach(e => if(containsLetDef(e)) { unit.error(realBody.pos, "Function postcondition should not contain nested function definition") throw ImpureCodeEncounteredException(realBody)